首页 > 代码库 > HDU 1503 Advanced Fruits[ LCS ]
HDU 1503 Advanced Fruits[ LCS ]
题目:HDU 1503
思路:先求出最长公共子序列,记录路径。后进行拼接。
代码
#include<cstdio> #include<cstring> #include<cstring> #include<vector> #include<iostream> #include<algorithm> #define mod 1000000007 using namespace std; typedef long long LL; int dp[110][120]; char x[100],y[100]; struct node{ int x,y; char c; }ans[220]; void LIS_len(int lx,int ly) { memset(dp,0,sizeof dp); for(int i=1;i<=lx;i++){ for(int j=1;j<=ly;j++){ if(x[i-1]==y[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } } int main() { while(cin>>x>>y) { int lx=strlen(x); int ly=strlen(y); LIS_len(lx,ly); int i=lx,j=ly; if(dp[lx][ly]==0) { printf("%s%s\n",x,y); continue; } int len=0; while(i&&j) { if(dp[i][j]==dp[i-1][j-1]+1&&x[i-1]==y[j-1]) { ans[len].x=i; ans[len].y=j; ans[len++].c=x[i-1]; i--;j--; } else if(dp[i-1][j]>=dp[i][j-1]) i--; else j--; } i=j=1; for(int k=len-1;k>=0;k--) { while(i!=ans[k].x) { printf("%c",x[i-1]); i++; } //cout<<j<<"&&"<<ans[k].y<<endl; while(j!=ans[k].y) { printf("%c",y[j-1]); j++; } printf("%c",ans[k].c); i++;j++; } printf("%s%s\n",x+ans[0].x,y+ans[0].y); } return 0; }
:
HDU 1503 Advanced Fruits[ LCS ]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。