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 }
View Code

 

posted @ 2016-03-20 00:05  yyblues  阅读(219)  评论(0编辑  收藏  举报