HDU2859

题意

给你一个n*n的矩阵,矩阵中只含有26个小写字母,求其中最大的对称矩阵的大小(对称矩阵:对角线是左下到右上)

分析

主要是根据题意找到突破口:每个对称矩阵的最下角

定义:以dp[i][j]为左下角的最大对称矩阵

转移:扩展的时候转移一下就好

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;

const int maxn = 1000+10;

int dp[maxn][maxn];
int n;
char s[maxn][maxn];

int main()
{
    while(scanf("%d", &n)!=EOF)
    {
        if(n==0)
            break;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%s", s[i]+1);
        }
        int maxx=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                int x=i, y=j;
                if(x==1||y==n)
                {
                    dp[i][j]=1;
                }
                else
                {

                    while(s[x][j] == s[i][y]&&x>=1&&y<=n)
                    {
                        x--;
                        y++;
                    }
                    int ans=i-x;
                    if(ans>=dp[i-1][j+1]+1) dp[i][j]=dp[i-1][j+1]+1;
                    else dp[i][j]=ans;

                }
                maxx=max(maxx,dp[i][j]);
            }
        }
        printf("%d\n", maxx);
    }
    return 0;
}
View Code

 

posted @ 2017-12-04 17:43  Superwalker  阅读(330)  评论(0编辑  收藏  举报