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;
}