hdu 2859 (二维dp)

来源:互联网 发布:人工智能在工厂的使用 编辑:程序博客网 时间:2024/05/01 22:49

点击打开链接


题意:

给你一个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 1001int 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;}



原创粉丝点击