题意:
找出以从左下角到右上角的对角线为对称线的最大的矩阵。
思路:
dp[i][j]表示以i,j为左下角顶点的最大对称矩形,则如果从i,j出发的向上和向右的线上相对称的点多于dp[i-1][j+1],则dp[i][j]=dp[i-1][j+1]+1.
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#define LL long long
#define MAX 1000005
#define inf 99999999999
#define mod 1000000007
using namespace std;
char a[1005][1005];
int dp[1005][1005];
int main()
{
int n,i,j,t1,t2,s,ans;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf(" %c",&a[i][j]);
dp[i][j]=1;//只有一个点时始终为一。
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==0||j==n-1)
continue;//不讨论这里的话dp数组会越界
t1=i;
t2=j;
ans=0;
while(t1>=0&&t2<n&&a[t1][j]==a[i][t2])
{
t1--;
t2++;
ans++;
//printf("%d\n",ans);
}
if(ans>dp[i-1][j+1])
dp[i][j]=dp[i-1][j+1]+1;
else
dp[i][j]=ans;
}
}
s=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
s=max(s,dp[i][j]);
}
}
printf("%d\n",s);
}
return 0;
}