最长公共子序列

来源:互联网 发布:自动化编程自学 编辑:程序博客网 时间:2024/06/05 17:40

描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列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所有公共子序列中最长的序列的长度。
 
输入
输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
 
输出
一个整数,表示最长各个子序列的长度。
格式:printf("%d\n");
 
输入样例
programming
contest
 
输出样例
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]的LCSint 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][n] << endl;    }}


0 0
原创粉丝点击