1. 程式人生 > >hdu 2859 (二維dp)

hdu 2859 (二維dp)

題意:

給你一個n*n的矩陣,矩陣中只含有26個小寫字母,求其中最大的對稱矩陣的大小

當我們算到s[i][j]時,每次我們只需要將它上方的和右方的依次比較,看是否相同

注意這裡不能只比較s[i-1][j]和s[i][j+1],因為可能出現不符合的情況,如

zaba

cbab

abbc

cacq

當我們比較到紅色的b的時候,如果只比較與他相鄰的兩個即綠色的b,就會從dp[i-1][j+1]多+1,而顯然藍色的部分不同

i!=0&&dp[i-1][j+1]>i-a時,dp[i][j]=dp[i-1][j+1]+1

i!=0&&dp[i-1][j+1]<i-a

(其中a為從當前位置找,找到的第一個不相等的x的位置,所以i-a就為最大的對稱矩陣的長度)時,dp[i][j]=i-a;

當i==0時,dp[i][j]=1;

#include"stdio.h"
#include"string.h"
#define N 1001

int dp[N][N];
char s[N][N];

int main()
{
    int n;
    int i,j;
    int a,b;
    int ans;

    while(scanf("%d",&n)!=-1&&n)
    {
        getchar();
        for(i=0;i<n;i++)
            gets(s[i]);

        ans=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(i==0)dp[i][j]=1;
                else
                {
                    a=i;
                    b=j;
                    while(s[a][j]==s[i][b])
                    {
                        a--;
                        b++;
                        if(a<0||b>=n)break;
                    }
                    a=i-a;
                    if(a>dp[i-1][j+1])
                        dp[i][j]=dp[i-1][j+1]+1;
                    else dp[i][j]=a;
                }
                if(dp[i][j]>ans)ans=dp[i][j];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}