最长公共子序列——Common Subsequence

问题 A: Common Subsequence

时间限制: 1 Sec  内存限制: 128 MB
提交: 7  解决: 5
[提交][状态][讨论版][命题人:add_lwn]

题目描述

给定序列的子序列是将给定的序列的一些元素(可能没有)省去。给定一个序列X = <x1, x2, ..., xm>另一个序列Z = <z1, z2, ..., zk>是X的子序列存在一个X的指数的严格递增的序列<i1, i2, ..., ik>,对于所有的j = 1,2,...,k, xij = zj。例如,Z = <a, b, f, c>,是X = <a, b, c, f, b, c>的子序列,其索引序列<1, 2, 4, 6>。给定两个序列X和Y,问题是求出X和Y的最大公子序列的长度。

程序输入来自一个文本文件。文件中的每个数据集包含两个字符串,表示给定的序列。这些序列由任意数量的空格分隔。输入数据是正确的。对于每一组数据,每行打印最长度公共子序列的长度。

输入

输出

样例输入

abcfbc abfcab
programming contest 
abcd mnp

样例输出

4
2
0
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char a[1000],b[1000];
int lena,lenb;
int dp[1000][1000];
int main()
{
    while(cin>>a)
    {
        cin>>b;
        lena=strlen(a);
        lenb=strlen(b);
        memset(dp,0,sizeof(dp));
        for(int i=0;i<lena;i++)
            for(int j=0;j<lenb;j++)
            {
                if(a[i]==b[j])
                    dp[i+1][j+1]=dp[i][j]+1;
                else
                    dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
            }
        cout<<dp[lena][lenb]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40729773/article/details/81333073