标签:http io os ar for sp on 代码 amp
题目: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 ]
标签:http io os ar for sp on 代码 amp
原文地址:http://blog.csdn.net/code_or_code/article/details/40084137