Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <iostream>
- #include <map>
- #include <set>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- #define REP(i,n) for(int i=0;i<(n);i++)
- const int SZ=504;
- const int INF=1000000000;
- char A[SZ][SZ];
- // move from (1,1) to (i,j)
- int dp1[SZ][SZ];
- // move from (i,j) to somewhere
- int dp2[SZ][SZ];
- int main()
- {
- int t;
- scanf("%d",&t);
- for(int test=1;test<=t;test++)
- {
- int n,m;
- scanf("%d%d",&n,&m);
- REP(i,n)
- scanf("%s",&A[i+1][1]);
- REP(i,n+2)
- A[i][0]=A[i][m+1]='#';
- REP(i,m+2)
- A[0][i]=A[n+1][i]='#';
- REP(i,n+2) REP(j,m+2)
- {
- dp1[i][j]=-INF;
- dp2[i][j]=0;
- }
- dp1[1][1]=1;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- if((i!=1 || j!=1) && A[i][j]!='#')
- dp1[i][j]=max(dp1[i-1][j],dp1[i][j-1])+1;
- for(int i=n;i>=1;i--)
- for(int j=m;j>=1;j--)
- if(A[i][j]!='#')
- dp2[i][j]=max(dp2[i+1][j],dp2[i][j+1])+1;
- int res=0;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- res=max(res,dp1[i][j]);
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- {
- // make left pass
- for(int l=j;l>=1;l--)
- {
- if(A[i][l]=='#') break;
- res=max(res,dp1[i-1][j]+j-l+1+dp2[i+1][l]);
- }
- // make up pass
- for(int l=i;l>=1;l--)
- {
- if(A[l][j]=='#') break;
- res=max(res,dp1[i][j-1]+i-l+1+dp2[l][j+1]);
- }
- }
- printf("Case #%d: %d\n",test,res);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment