knightL

C

Dec 9th, 2013
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #include <vector>
  2. #include <queue>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iostream>
  6. #include <map>
  7. #include <set>
  8. #include <cstring>
  9. #include <cstdio>
  10. using namespace std;
  11. #define REP(i,n) for(int i=0;i<(n);i++)
  12.  
  13. const int SZ=504;
  14. const int INF=1000000000;
  15.  
  16. char A[SZ][SZ];
  17.  
  18. // move from (1,1) to (i,j)
  19. int dp1[SZ][SZ];
  20. // move from (i,j) to somewhere
  21. int dp2[SZ][SZ];
  22.  
  23. int main()
  24. {
  25.     int t;
  26.     scanf("%d",&t);
  27.     for(int test=1;test<=t;test++)
  28.     {
  29.         int n,m;
  30.         scanf("%d%d",&n,&m);
  31.         REP(i,n)
  32.             scanf("%s",&A[i+1][1]);
  33.         REP(i,n+2)
  34.             A[i][0]=A[i][m+1]='#';
  35.         REP(i,m+2)
  36.             A[0][i]=A[n+1][i]='#';
  37.         REP(i,n+2) REP(j,m+2)
  38.         {
  39.             dp1[i][j]=-INF;
  40.             dp2[i][j]=0;
  41.         }
  42.         dp1[1][1]=1;
  43.         for(int i=1;i<=n;i++)
  44.             for(int j=1;j<=m;j++)
  45.                 if((i!=1 || j!=1) && A[i][j]!='#')
  46.                     dp1[i][j]=max(dp1[i-1][j],dp1[i][j-1])+1;
  47.  
  48.         for(int i=n;i>=1;i--)
  49.             for(int j=m;j>=1;j--)
  50.                 if(A[i][j]!='#')
  51.                     dp2[i][j]=max(dp2[i+1][j],dp2[i][j+1])+1;
  52.         int res=0;
  53.         for(int i=1;i<=n;i++)
  54.             for(int j=1;j<=m;j++)
  55.                 res=max(res,dp1[i][j]);
  56.         for(int i=1;i<=n;i++)
  57.             for(int j=1;j<=m;j++)
  58.             {
  59.                 // make left pass
  60.                 for(int l=j;l>=1;l--)
  61.                 {
  62.                     if(A[i][l]=='#') break;
  63.                     res=max(res,dp1[i-1][j]+j-l+1+dp2[i+1][l]);
  64.                 }
  65.                 // make up pass
  66.                 for(int l=i;l>=1;l--)
  67.                 {
  68.                     if(A[l][j]=='#') break;
  69.                     res=max(res,dp1[i][j-1]+i-l+1+dp2[l][j+1]);
  70.                 }
  71.             }
  72.         printf("Case #%d: %d\n",test,res);
  73.     }
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment