zoukankan      html  css  js  c++  java
  • HDU 2859 Phalanx

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2859

    解题思路:

    对于每个字符看该列以上和该行右侧的字符匹配量,如果匹配量大于右上角记录下来的矩阵大小,就是右上角的数值+1,否则就是这个匹配量。

    实现代码:

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    const int MAXN=1010;
    int dp[MAXN][MAXN];
    char ch[MAXN][MAXN];
    
    
    int main(){
        int N;
        while(scanf("%d",&N)&&N){
            for(int i=0;i<N;i++)
                scanf("%s",ch[i]);
            int ans=1;
            memset(dp,0,sizeof(dp));
            for(int i=0;i<N;i++)
            for(int j=0;j<N;j++){
                if(i==0||j==N-1){
                    dp[i][j]=1;
                    continue;
                }
                int t1=i,t2=j;
                while(t1>=0&&t2<N&&ch[t1][j]==ch[i][t2]){
                    t1--;
                    t2++;
                }
                t1=i-t1;
                if(t1>=dp[i-1][j+1]+1)
                    dp[i][j]=dp[i-1][j+1]+1;
                else
                    dp[i][j]=t1;
                ans=max(ans,dp[i][j]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }

    下面的超时:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int MAXN=1000;
    const int INF=1<<30;
    int dp[MAXN][MAXN];
    char ch[MAXN][MAXN];
    /*
    dp[i][j]表示以a[i][j]为左下角的对称矩阵的大小;
    */
    
    
    int main(){
        int N;
        while(scanf("%d",&N)!=EOF&&N){
            for(int i=0;i<N;i++)
                scanf("%s",ch[i]);
            for(int i=0;i<N;i++)
                dp[0][i]=1;
            int res=1;
    
            for(int i=1;i<N;i++){
                for(int j=0;j<N;j++){
                    dp[i][j]=1;
                    int t1=i,t2=j;
                    while(t1>=0&&t2<N){
                        t1-=dp[i][j];
                        t2+=dp[i][j];
                        if(t1<0||t2>=N) break;
                        if(dp[i][j]==dp[t1][t2]){
                            dp[i][j]*=2;
                            continue;
                        }
                        t1-=1;
                        t2+=1;
                        if(t1<0||t2>=N) break;
                        if(dp[i][j]==dp[t1][t2])
                            dp[i][j]=2*dp[i][j]+1;
                    }
                    res=max(res,dp[i][j]);
                }
            }
            printf("%d
    ",res);
        }
        return 0;
    }
  • 相关阅读:
    网络学习笔记
    zabbix4.2学习笔记系列
    ansible2.7学习笔记系列
    记一次磁盘UUID不能识别故障处理
    白话ansible-runner--1.环境搭建
    kubernetes的思考
    计算机网络原理精讲第六章--应用层
    计算机网络原理精讲第五章--传输层
    centos7下LVM挂载和扩容
    多线程下载命令--axel
  • 原文地址:https://www.cnblogs.com/IKnowYou0/p/6639349.html
Copyright © 2011-2022 走看看