dp[i][j]代表以s[i][j]字符为右上角的最大对称方阵的尺寸
最左边那一列都为1,然后按列更新,代码实现比较简单,感觉有点卡时间,如果对称度很好,时间应该比较高,我只会这种了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
char s[][];
int dp[][];
int main()
{
int n;
while(~scanf("%d",&n),n)
{
for(int i=;i<=n;i++)
scanf("%s",s[i]+);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
dp[i][]=;
int ans=;
for(int j=;j<=n;j++)
{
for(int i=;i<=n;i++)
{
dp[i][j]=;
int l=min(j-,n-i);
for(int k=;k<=l;++k)
{
int x=i+k;
int y=j-k;
if(s[i][y]!=s[x][j])
break;
if(dp[i+][j-]>=k)dp[i][j]=k+;
}
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}
return ;
}