一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。
参考博客:动态规划 最长公共子序列 过程图解
例题:
F - Common Subsequence
#include <stdio.h>
#include <string>
#include <string.h>
#define M 1000
#define max(a,b) a>b?a:b
int main()
{
char a[M],b[M];
int l1,l2,dp[M][M];
while(scanf("%s %s",a,b)!=EOF)
{
l1=strlen(a);
l2=strlen(b);
memset(dp,0,sizeof(dp));
for(int i=1;i<=l1;i++)
{
for(int j=1;j<=l2;j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=max(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[l1][l2]);
}
return 0;
}