zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        }
        return 0;
    }



  • 相关阅读:
    js json与字符串相互转换
    Web 加入favicon
    JS 深拷贝
    C# 读取配置文件
    设计模式之抽象工厂模式
    设计模式之工厂方法的隐藏
    设计模式之工厂方法的重载
    设计模式之工厂方法配置文件与反射
    C#设计模式之工厂方法模式
    jq解析json文件
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3212303.html
Copyright © 2011-2022 走看看