HDU 2859 Phalanx
Posted IKnowYou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\\n",res); } return 0; }
以上是关于HDU 2859 Phalanx的主要内容,如果未能解决你的问题,请参考以下文章