zoukankan      html  css  js  c++  java
  • HDU 2859 Phalanx (DP)

    Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th anniversary of the PRC. 
    A phalanx is a matrix of size n*n, each element is a character (a~z or A~Z), standing for the military branch of the servicemen on that position. 
    For some special requirement it has to find out the size of the max symmetrical sub-array. And with no doubt, the Central Military Committee gave this task to ALPCs. 
    A symmetrical matrix is such a matrix that it is symmetrical by the “left-down to right-up” line. The element on the corresponding place should be the same. For example, here is a 3*3 symmetrical matrix: 
    cbx 
    cpb 
    zcc
    Input
    There are several test cases in the input file. Each case starts with an integer n (0<n<=1000), followed by n lines which has n character. There won’t be any blank spaces between characters or the end of line. The input file is ended with a 0.
    Output
    Each test case output one line, the size of the maximum symmetrical sub- matrix. 
    Sample Input
    3
    abx
    cyb
    zca
    4
    zaba
    cbab
    abbc
    cacq
    0
    Sample Output
    3
    3


    状态:dp[i][j]为第i行第j列所能够组成的最大对称子矩阵的长度。关于对角线完全对称的矩阵!

    转移方程为:dp[i][j]=dp[i-1][j+1]+1 ; 注意这里是由点(i-1,j+1)推过来的。因为我们在这里矩阵的对角线是由左下角推到右上角去的。

    首先我们要进行初始化,第0行的它们所能组成的dp[0][i]=1,最大只能组成1个。

    然后我们对每个点进行判断(i,j),当然它是从(i-1,j+1)推过来的。但是对于每个字符看该列以上和该行右侧的字符匹配量,如果该匹配量大于右上角记录下来的矩阵大小,那么就是右上角的数值加1,否则就是这个匹配量(因为我们我们每次都要满足所有的,所以要尽可能的取小的)

    参考网址:here

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define maxn 1111
    int dp[maxn][maxn];
    char arr[maxn][maxn];
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            if(n==0) break;
            int ans=1;
            for(int i=0; i<n; i++) scanf("%s",arr[i]);
            for(int i=0; i<n; i++) dp[0][i]=1;
            for(int i=1; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    int tmpx=i,tmpy=j;
                    while( tmpx>=0 && tmpy<n && arr[tmpx][j]==arr[i][tmpy] )
                        tmpx--, tmpy++;
                    dp[i][j] = min(dp[i-1][j+1]+1,i-tmpx);
                    ans=max(ans,dp[i][j]);
                }
            }
            printf("%d
    ",ans);
        }
    }


    稍微改动下, 注意边界细节!!!改完之后感觉没有上面代码清爽!!!


    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define maxn 1111
    int dp[maxn][maxn];
    char arr[maxn][maxn];
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            if(n==0) break;
            int ans=1;
            for(int i=0; i<n; i++) scanf("%s",arr[i]);
            for(int i=0; i<n; i++) dp[0][i]=1;
            for(int i=1; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    int tmpx=i,tmpy=j;
                    while( tmpx>=0 && tmpy<n && arr[tmpx][j]==arr[i][tmpy] && dp[i-1][j+1]+1>i-tmpx)///
                        tmpx--, tmpy++;
                    dp[i][j] = i-tmpx; ///tmpx最后所指向的不符合条件的位置,这样就不用加1了(其实长度应该是i-符合条件的位置)
                    ans=max(ans,dp[i][j]);
                }
            }
            printf("%d
    ",ans);
        }
    }
    



  • 相关阅读:
    Tomcat服务器本地的搭建,以及在 IDEA软件下的配置,以及项目的测试运行(基于supermvc框架下的web)
    数据可视化-EChart2.0.0使用中遇到的2个问题
    数据可视化-EChart2.0使用总结2
    数据可视化-EChart2.0使用总结1
    Mac下有道笔记本问题反馈
    修复bootstrap daterangepicker中的3个问题
    使用jQuery封装实用函数
    Web Fundamentsals学习1-Multiple-Screen-Site
    安装Git
    学会使用Git创建分支
  • 原文地址:https://www.cnblogs.com/zswbky/p/6792907.html
Copyright © 2011-2022 走看看