首页 > 代码库 > HDU 2859 Phalanx
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。