51nod 最长公共子序列 (DP+回溯)

来源:互联网 发布:淘宝怎么上一千零一夜 编辑:程序博客网 时间:2024/06/07 18:33
输入

第1行:字符串A第2行:字符串B(A,B的长度 <= 1000)

输出

输出最长的子序列,如果有多个,随意输出1个。

输入示例

abcicbaabdkscab

输出示例

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[n][m]<<endl;cout<<endl;return 0;}

















0 0
原创粉丝点击