UVA - 10405
Description Problem C: Longest Common SubsequenceSequence 1: Sequence 2: abcdgh aedfhris adh of length 3. 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 For each subsequent pair of input lines, output a line containing one integer number which satisfies the criteria stated above. Sample inputa1b2c3d4e zz1yy2xx3ww4vv abcdgh aedfhr abcdefghijklmnopqrstuvwxyz a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0 abcdefghijklmnzyxwvutsrqpo opqrstuvwxyzabcdefghijklmn Output for the sample input4 3 26 14 Problem Setter: Piotr Rudnicki Source
Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) ::
Volume 5. Dynamic Programming
Root :: Competitive Programming: Increasing the Lower Bound of Programming Contests (Steven & Felix Halim) :: Chapter 6. String Processing :: String Processing with DP Root :: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim) :: String Processing :: String Processing with Dynamic Programming :: Classic Root :: Prominent Problemsetters :: Piotr Rudnicki Root :: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim) :: String Processing :: String Processing with Dynamic Programming - Standard |
注意:数据中可能会有空格,用gets或getline输入.....这样WA了两次....
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn];//dp[i][j]表示第一个字符串的前i个字符和第二个字符串的前j个字符的最长公共子串
char str1[maxn], str2[maxn];
int main() {
while(gets(str1) && gets(str2)) {
memset(dp, 0, sizeof(dp));
int 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 dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
}
}
printf("%d\n", dp[len1][len2]);
}
return 0;
}