Phalanx HDU - 2859 dp

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=1010;
int n;
char a[N][N];
//da[i][j]是a[i][j]作为左下角时的最大对称矩阵 
int dp[N][N];
int main(){
    while(cin>>n&&n)
    {
        int ans=1;
        memset(dp,0,sizeof dp);
        for(int i=0;i<n;i++)
            cin>>a[i];
        //枚举对角线端点 
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++)
            {
                //第一行和最后一列初始为1,因为无法继续延伸
                if(i==0||j==n-1)
                {   
                    dp[i][j]=1;
                    continue;
                }
                //对角线的 
                int t1=i,t2=j;
                //从(i,j)分别向上向右延伸,直到不相等为止 
                while(t1>=0&&t2<=n-1&&a[t1][j]==a[i][t2])
                {
                    t1--;
                    t2++;
                }
                int k=i-t1;
                // da[i][j]是   a[i][j]   作为   左下角  时的最大对称矩阵 
                //画图便于理解
                //while里面扩展的是最外层
                //取min是要顾及里层的 
                dp[i][j]=min(dp[i-1][j+1]+1,k);
                ans=max(ans,dp[i][j]);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2020-01-28 19:51  晴屿  阅读(103)  评论(0编辑  收藏  举报