51nod 最长公共子序列 (DP+回溯)
2015-10-09 01:21
127 查看
输入
输出
输入示例
输出示例
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1000+100; char s1[maxn],s2[maxn]; int dp[maxn][maxn],vis[maxn][maxn]; void print(int i,int j) { if(i==0||j==0) return ; if(vis[i][j]==1) { print(i-1,j-1); cout<<s1[i-1]; } if(vis[i][j]==2) { print(i-1,j); } if(vis[i][j]==3) { print(i,j-1); } } int main() { int n,m,i,j; memset(vis,0,sizeof(vis)); scanf("%s%s",s1,s2); n=strlen(s1); m=strlen(s2); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(s1[i-1]==s2[j-1]) { dp[i][j]=dp[i-1][j-1]+1; vis[i][j]=1; } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j]=dp[i-1][j]; vis[i][j]=2; } else { dp[i][j]=dp[i][j-1]; vis[i][j]=3; } } } print(n,m); //cout<<dp [m]<<endl; cout<<endl; return 0; }
相关文章推荐