您的位置:首页 > 其它

51NOD 1006 最长公共子序列 动态规划

2016-09-25 21:30 281 查看

题目描述:

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba

abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

Input

第1行:字符串A

第2行:字符串B

(A,B的长度 <= 1000)

Output

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

Input示例

abcicba
abdkscab


Output示例

abca


题目分析:

LCS最长公共子序列。

动态规划的入门题目。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int dp[1001][1001];
char X[1001];
char Y[1001];
int i, j;

int  main()
{
cin.getline(X,1001);
cin.getline(Y,1001);

int xlen = strlen(X);
int ylen = strlen(Y);

for(i = 1; i <= xlen; ++i)
{
for(j = 1; j <= ylen; ++j)
{
if(X[i-1] == Y[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else if(dp[i][j-1] > dp[i-1][j])
{
dp[i][j] = dp[i][j-1];
}
else
{
dp[i][j] = dp[i-1][j];
}
}
}
i = xlen;
j = ylen;
int k = dp[i][j];
char lcs[1001] = {'\0'};
while(i && j)
{
if(X[i-1] == Y[j-1] && dp[i][j] == dp[i-1][j-1] + 1)
{
lcs[--k] = X[i-1];
i--;
j--;
}
else if(X[i-1] != Y[j-1] && dp[i-1][j] > dp[i][j-1])  i--;
else j--;
}
printf("%s\n",lcs);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: