Longest Common Subsequence
最長共通部分列
最長共通部分列問題 (Longest Common Subsequence problem: LCS)は、2つの与えられた列 X={x1,x2,...,xm} と Y={y1,y2,...,yn} の最長共通部分列を求める問題です。
ある列
Z
が
与えられた2つの文字列
X
、
入力
複数のデータセットが与えられます。最初の行にデータセットの数
出力
各データセットについて
X
,
制約
1≤X,Yの長さ≤1,000
X
または
入力例 1
3
abcbdab
bdcaba
abc
abc
abc
bc
出力例 1
4
3
2
参考文献
Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.
解题思路:
本题是一个裸的LCS,动态转移方程如下
当
否则
dp[i][j]=max(dp[i−1][j],dp[i][j−1])
i和j表示序列一的前i个字符和序列二的前j个字符的最长公共子序列的长度为dp[i][j]
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1050;
char s1[maxn],s2[maxn];
int f[maxn][maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s1,s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
memset(f,0,sizeof(f));
for(int i = 0;i <= len1; i++)
{
for(int j = 0;j <= len2; j++)
{
if(i == 0 || j == 0)f[i][j] = 0;
else
{
if(s1[i-1] == s2[j-1])f[i][j] = f[i-1][j-1] + 1;
else f[i][j] = max(f[i-1][j],f[i][j-1]);
}
}
}
printf("%d\n",f[len1][len2]);
}
}