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;
}
原文地址:https://www.cnblogs.com/IKnowYou0/p/6639349.html