给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
输入格式:
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
输出格式:
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
输入样例:
ABCBDAB
BDCABA
输出样例:
4
参考代码:
#include <stdio.h>
#include <string.h>
int dp[505][505];
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
char s1[505], s2[505];
int len1, len2;
while (~scanf("%s %s", s1, s2))
{
len1 = strlen(s1);
len2 = strlen(s2);
for (int i = 0; i <= len1; i++)
dp[i][0] = 0;
for (int i = 0; i <= len2; i++)
dp[0][i] = 0;
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++)
if (s1[i - 1] == s2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
printf("%d\n",dp[len1][len2]);
}
return 0;
}