题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859
题意:找出矩阵中最大的以右对角线为轴对称的子矩阵
解题思路:dp[i][j]表示以i和j为左下角向上方和右方延伸的最长相同长度
dp[i][j]由dp[i-1][j+1]决定,最大也只能比dp[i-1][j+1]大一,因为(i-1,j+1)为(i,j)的右上角,以他们为对角线组成子矩阵。如果dp[i-1][j+1]为1(即它自身),那么dp[i-1][j+1]要想找对称子矩阵也只能是1或者2。
所以dp主体为:
for(int i=0;i<n;i++){
for(int j=n-1;j>=0;j--){ //右上到左下
dp[i][j]=1;
if(i==0||j==n-1)
continue;
int t=dp[i-1][j+1]; //以右上方为标准 如果是对称子矩阵,一定是从右上角依次递增(1 2 3 4 5...),最大也只能是dp[i-1][j+1]+1
for(int k=1;k<=t;k++){
if(s[i-k][j]==s[i][j+k])
dp[i][j]++;
else
break;
}
ans=max(ans,dp[i][j]);
}
}
#include<iostream>
#include<cstdio>
using namespace std;
int n;
char s[1100][1100];
int dp[1100][1100];
int ans;
int max(int a,int b){
return a<b? b:a;
}
int main(){
while(cin>>n){
if(n==0) break;
ans=1;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
scanf("%s",s[i]);
for(int i=0;i<n;i++){
for(int j=n-1;j>=0;j--){ //右上到左下
dp[i][j]=1;
if(i==0||j==n-1)
continue;
int t=dp[i-1][j+1]; //以右上方为标准 如果是对称子矩阵,一定是从右上角依次递增(1 2 3 4 5...)
for(int k=1;k<=t;k++){
if(s[i-k][j]==s[i][j+k])
dp[i][j]++;
else
break;
}
ans=max(ans,dp[i][j]);
}
}
cout<<ans<<endl;
}
return 0;
}