dp[i][j]表示以点i、j为左下角的最大对称子矩阵长度。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
const int maxn=1010;
char g[maxn][maxn];
int dp[maxn][maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1; i<=n; ++i)
scanf("%s",g[i]+1);
int ans=0;
for(int i=1; i<=n; ++i)
{
for(int j=n; j>=1; --j)
{
int l=dp[i-1][j+1];
int k=0;
for(; k+1<=l&&g[i-k-1][j]==g[i][j+k+1]; ++k);
dp[i][j]=min(k,dp[i-1][j+1])+1;
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}
return 0;
}