HDU 2859 Phalanx
找对称的最大阵,对角线为左下到右上。
一上来读错了,以为只要验证对角线上的块,写成了区间dp,wa。。。
后来没想,直接2*n*n*n。。。直接超时,最后才好了一点。
#include <cstdio>
#include <iostream>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
char a[1010][1010];
int dp[1010][1010];
int main()
{
int n;
while (scanf ("%d",&n)&&n)
{
int ans=1;
memset(dp,0,sizeof(dp));
for (int i=0;i<n;i++) scanf ("%s",&a[i]);
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (i==0||j==n-1) {dp[i][j]=1;continue;}
int maxn=0,ti=i,tj=j;
while (ti>=0&&tj<n&&a[i][tj]==a[ti][j])
{
ti--;
tj++;
maxn++;
}
dp[i][j]=min(dp[i-1][j+1]+1,maxn);
ans=max(ans,dp[i][j]);
}
}
printf ("%d\n",ans);
}
return 0;
}