您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: