1. 程式人生 > >UVA10405 Longest Common Subsequence【LCS+DP】

UVA10405 Longest Common Subsequence【LCS+DP】

Given two sequences of characters, print the length of the longest common subsequence of both sequences.
    Sequence 1:

    Sequence 2:

    For example, the longest common subsequence of the following two sequences ‘abcdgh’ ans ‘aedfhr’ is ‘adh’ of length 3.

Input
Input consists of pairs of lines. The first line of a pair contains the first string and the second line contains the second string. Each string is on a separate line and consists of at most 1,000 characters

Output
For each subsequent pair of input lines, output a line containing one integer number which satisfies the criteria stated above.

Sample Input
bcacbcabbaccbab
bccabccbbabacbc
a1b2c3d4e
zz1yy2xx3ww4vv
abcdgh
aedfhr
abcdefghijklmnopqrstuvwxyz
a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0
abcdefghijklmnzyxwvutsrqpo
opqrstuvwxyzabcdefghijklmn

Sample Output
11
4
3
26
14

問題連結UVA10405 Longest Common Subsequence
問題描述:(略)
問題分析
    動態規劃問題,是一個標準模板題,套模板就可以了。
    需要注意字串長度!
程式說明


    需要注意,要用行讀入函式gets()讀入資料,不能使用格式化輸入"%s%s",不然會WA。
參考連結:(略)
題記:(略)

AC的C語言程式如下:

/* UVA10405 Longest Common Subsequence */

#include <stdio.h>
#include <string.h>

#define MAX(x,y) (((x) > (y)) ? (x) : (y))

#define N 1000
char a[N + 2], b[N + 2];
int dp[N + 1][N + 1];

int lcs(char *p, char *q)
{
    memset(dp, 0, sizeof(dp));

    int len1 = strlen(p + 1);
    int len2 = strlen(q + 1);
    int i, j;
    for(i = 1; i <= len1; i++)
        for(j = 1; j <= len2; j++) {
            if(p[i] == q[j])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                dp[i][j] = MAX(dp[i - 1][j], dp[i][j - 1]);
        }

    return dp[len1][len2];
}

int main(void)
{
    while(gets(a + 1), gets(b + 1))
        printf("%d\n", lcs(a, b));

    return 0;
}