题目链接: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 ",ans); 32 } 33 return 0; 34 }