您的位置:首页 > 其它

最长公共子序列

2016-04-14 19:28 295 查看
[align=left]描述[/align]
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有:

Xij = Zj

如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。

求A、B所有公共子序列中最长的序列的长度。

[align=left]输入[/align]
输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。

[align=left]输出[/align]
一个整数,表示最长各个子序列的长度。

格式:printf("%d\n");

[align=left]输入样例[/align]
programming

contest

[align=left]输出样例[/align]
2

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char s1[210];
char s2[210];
int c[210][210];    //c[i][j]表示s1[1,i]和s2[1,j]的LCS
int b[210][210];    //记录路径

void LCS(int m, int n)
{
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(s1[i-1] == s2[j-1])      //i,j从0开始
{
c[i][j] = c[i-1][j-1]+1;//从对角
b[i][j] = 0;
}
else if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];    //从上方
b[i][j] = 1;
}
else
{
c[i][j] = c[i][j-1];    //从左边
b[i][j] = -1;
}
}
}
}

void Print(int i, int j)
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 0)
{
Print(i-1, j-1);
cout << s1[i-1] << endl;
}
else if(b[i][j] == 1)
Print(i-1, j);
else
Print(i, j-1);
}
int main()
{
while(cin >> s1 >> s2)
{
memset(c, 0, sizeof(c));
memset(b, 0, sizeof(b));
int m = strlen(s1);
int n = strlen(s2);
LCS(m, n);
//Print(m, n);
cout << c[m]
<< endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: