您的位置:首页 > 其它

51nod动态规划入门--最长公共子序列

2016-03-23 19:06 302 查看
题目:给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

输入

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


输出

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


输入示例

abcicba
abdkscab


输出示例

abca


代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char A[1010],B[1010];
int LCS[1010][1010];
int b[1010][1010];
void PrintLCS(int d[][1010], char *x, int i, int j)
{
if(i==0 || j==0)
return;
if(d[i][j]==0)
{
PrintLCS(d,x,i-1,j-1);
printf("%c",x[i-1]);
}
else if(d[i][j]==1)
PrintLCS(d,x,i-1,j);
else
PrintLCS(d,x,i,j-1);
}
//void P(char *x){
//	int l=strlen(x);
//	for(int i=0;i<l;i++){
//		printf("%c ",x[i]);
//	}
//}
int  main(){
int x,y;
while(scanf("%s%s",A+1,B+1)!=EOF){
int l1=strlen(A+1);
int l2=strlen(B+1);
for(x=0;x<=l1;x++){
for(y=0;y<=l2;y++){
if(x==0||y==0){
LCS[x][y]=0;
b[x][y]=0;
}
else if(A[x]==B[y]){
LCS[x][y]=LCS[x-1][y-1]+1;
b[x][y]=0;
}
else if(LCS[x-1][y]>=LCS[x][y-1]){
LCS[x][y]=LCS[x-1][y];
b[x][y]=1;
}
else{
LCS[x][y]=LCS[x][y-1];
b[x][y]=-1;
}
}
}
PrintLCS(b, A+1, l1, l2);
printf("\n");
//        P(A+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: