2080最长公共子序列问题(DP)
Description
给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
Input
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
Output
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
Sample
Input
ABCBDAB BDCABA
Output
4
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <string> 5 #define inf 0x3f3f3f3f 6 using namespace std; 7 8 int main() 9 { 10 int len1, len2, i, j; 11 char s1[505], s2[505]; 12 int dp[505][505]; 13 while(gets(s1)&&gets(s2)) 14 { 15 len1 = strlen(s1); 16 len2 = strlen(s2); 17 memset(dp, 0, sizeof(dp)); 18 for(i=1;i<=len1;i++) 19 { 20 for(j=1;j<=len2;j++) 21 { 22 if(s1[i-1]==s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; 23 else dp[i][j] = max(dp[i][j-1], dp[i-1][j]); 24 } 25 } 26 cout << dp[len1][len2] << endl; 27 } 28 return 0; 29 }