Problem C: Longest Common Subsequence
Sequence 1:
Sequence 2:
Given two sequences of characters, print thelength of the longest common subsequence of both sequences. Forexample, the longest common subsequence of the following twosequences:
abcdgh aedfhris adh of length 3.
Input consists of pairs of lines. The first line of a pair containsthe first string and the second line contains the second string. Eachstring is on a separate line and consists of at most 1,000 characters
For each subsequent pair of input lines, output a line containing oneinteger number which satisfies the criteria stated above.
Sample input
a1b2c3d4e zz1yy2xx3ww4vv abcdgh aedfhr abcdefghijklmnopqrstuvwxyz a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0 abcdefghijklmnzyxwvutsrqpo opqrstuvwxyzabcdefghijklmn
Output for the sample input
4 3 26 14 求最长公共子序列, 动规的经典题目~ DP[i][j]数组的意思为: 以X数组i位置的字符结尾的, 在Y数组j位置时, 最长的序列长度~ 找出状态转移方程说难也难, 说容易也容易, 找出来就发现问题简单了~ 必须AC:#include<stdio.h> #include<string.h> char str1[1005]; char str2[1005]; int DP[1005][1005]; int main() { while(gets(str1) != NULL) { gets(str2); int len1, len2; memset(DP, 0, sizeof(DP)); len1 = strlen(str1); len2 = strlen(str2); for(int i = 0; i < len1; i++) { for(int j = 0; j < len2; j++) { if(str1[i] == str2[j]) DP[i+1][j+1] = DP[i][j] + 1; else { if(DP[i][j+1] >= DP[i+1][j]) DP[i+1][j+1] = DP[i][j+1]; else DP[i+1][j+1] = DP[i+1][j]; } } } printf("%d\n", DP[len1][len2]); } }