POJ 1458 Common Subsequence【最長公共子序列】

Common Subsequence
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 59599 Accepted: 24845

Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming    contest 
abcd           mnp

Sample Output

4
2
0

Source

題意:給你兩個序列,讓你求他們的最長公共子序列的長度。

值得注意的是:公共子序列不是公共子串。

列如:X={3,0,2,5,1,7,6,4},它的子序列可以爲{3,5,4}。但其子串爲位置相臨近的幾個元素,如{2,5,1,7}。

最長公共子序列的求法參看網址:

https://blog.csdn.net/hrn1216/article/details/51534607
思路:假設我們用c[i][j]表示Xi和Yi的最長公共子序列的長度,則有如下遞推公式:

題解:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
#define M(a,b) memset(a,b,sizeof(a))
const int MAXN=1005;
int c[MAXN][MAXN];
int main()
{
    char s1[MAXN];
    char s2[MAXN];
    while(~scanf("%s",&s1))
    {
        scanf("%s",&s2);
        int n=strlen(s1);
        int m=strlen(s2);
        M(c,0);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {

                    if(s1[i]==s2[j])///字符s1[i]與s2[j]相等,c[i][j]= c[i-1,j-1] + 1。
                           c[i+1][j+1]=c[i][j]+1;
                 else
                    c[i+1][j+1]=max(c[i][j+1],c[i+1][j]);///否則,取c[i-1,j] 和 c[i,j-1]的最大值
            }

        }
        printf("%d\n",c[n][m]);
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章