HDU2859

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859

AC思路:(思路来源于kuangbin,甚至做法也跟kuangbin大同小异,所以可以将本文看成是对于这篇博文(http://www.cnblogs.com/kuangbin/p/3228215.html)的一个评论。。。)

  用dp[i][j]代表以点(i,j)为左下角的最大的对称矩阵的边长,计算从该点出发向上和向右走,字符相等的最大长度x,如果长度x大于dp[i-1][j+1],则dp[i][j] = dp[i-1][j+1] +1,否则dp[i][j]就只是x。

  具体看代码比较好懂。

AC代码:

 1 #include <cstring>
 2 #include <cstdio>
 3 using namespace std;
 4 const int maxn=1000+10;
 5 char st[maxn][maxn];
 6 int dp[maxn][maxn];
 7 int main()
 8 {
 9     int n;
10     while(scanf("%d",&n)==1&&n){
11         for(int i=0;i<n;i++)
12             scanf("%s",st[i]);
13         memset(dp,0,sizeof(dp));
14         int ans=1;
15         for(int i=0;i<n;i++)
16             for(int j=0;j<n;j++){
17                 if(i==0||j==n-1){
18                     dp[i][j]=1;
19                 }
20                 else{
21                     int ti=i,tj=j;
22                     while(ti>=0&&tj<n&&st[ti][j]==st[i][tj]){
23                         ti--;
24                         tj++;
25                     }
26                     if(tj-j>=dp[i-1][j+1]+1)  dp[i][j]=dp[i-1][j+1]+1;
27                     else    dp[i][j]=tj-j;
28                 }
29                 if(dp[i][j]>ans)    ans=dp[i][j];
30             }
31         printf("%d\n",ans);
32     }
33     return 0;
34 }

 

  

posted @ 2017-08-07 22:24  Blogggggg  阅读(126)  评论(0编辑  收藏  举报