POJ 3616 Milking Time (字符串DP)
题意:找元素关于对角线左或右对称的最大矩阵
思路:左右对角线只需要遍历一条就可以了。只要当前点往上遍历和往后遍历一样就可以。
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstring> 10 #include<stack> 11 #include<cmath> 12 #include<queue> 13 #define clc(a,b) memset(a,b,sizeof(a)) 14 #include <bits/stdc++.h> 15 using namespace std; 16 #define LL long long 17 const int maxn = 20005; 18 const int inf=0x3f3f3f3f; 19 const double pi=acos(-1); 20 char str[1010][1010]; 21 int ans; 22 int dp[1010][1010]; 23 24 void fun(int x,int y) 25 { 26 int num=dp[x-1][y-1]; 27 int i; 28 for(i=1; i<=num; i++) 29 { 30 if(str[x-i][y]!=str[x][y-i]) 31 break; 32 } 33 if(i>num) 34 dp[x][y]=dp[x-1][y-1]+1;//转移方程 35 else 36 dp[x][y]=i; 37 if(ans<dp[x][y]) 38 ans=dp[x][y]; 39 } 40 41 int main() 42 { 43 int n; 44 while(scanf("%d",&n),n) 45 { 46 ans=0; 47 memset(dp,0,sizeof(dp)); 48 for(int i=n; i>=1; i--) 49 scanf("%s",&str[i][1]); 50 for(int i=1; i<=n; i++) 51 { 52 for(int j=1; j<=n; j++) 53 { 54 fun(i,j); 55 } 56 } 57 printf("%d\n",ans); 58 } 59 return 0; 60 }