题由:
百度百科
最长公共子序列(LCS) 是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。
模板加Test如下:
#include <bits/stdc++.h>
#define MAX 1001
using namespace std;
string lu[MAX][MAX];
int dp[MAX][MAX];
void LCS(string a,string b)
{
for (int i=1;i<=a.size();i++)
{
for (int j=1;j<=b.size();j++)
{
if (a[i-1]==b[j-1])
{//若相等 则满足要求 长度加1
dp[i][j]=dp[i-1][j-1]+1;
lu[i][j]=lu[i-1][j-1]+a[i-1];
}
else //若不相等 则分析上一行的值和前一次的值大小关系
if (dp[i-1][j]>dp[i][j-1])
{//永远取大
dp[i][j]=dp[i-1][j];
lu[i][j]=lu[i-1][j];
}
else
{//永远取大
dp[i][j]=dp[i][j-1];
lu[i][j]=lu[i][j-1];
}
}
}
/**Test**/
cout<<"The dp:"<<endl;
for (int i=1;i<=a.size();i++)
{//输出dp
for (int j=1;j<=b.size();j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}
cout<<"The lu:"<<endl;
for (int i=1;i<=a.size();i++)
{//输出路径
for (int j=1;j<=b.size();j++)
cout<<lu[i][j]<<" ";
cout<<endl;
}
}
int main()
{
string a,b;
cin>>a>>b;
LCS(a,b);
cout<<"The lenght:"<<dp[a.size()][b.size()]<<endl;
cout<<"The str:"<<lu[a.size()][b.size()]<<endl;
return 0;
}
样例:
appjudge123
a2ujgd231
输出:
The dp:
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 2 2 2 2 2 2
1 1 2 2 2 2 2 2 2
1 1 2 2 2 3 3 3 3
1 1 2 2 3 3 3 3 3
1 1 2 2 3 3 3 3 3
1 1 2 2 3 3 3 3 4
1 2 2 2 3 3 4 4 4
1 2 2 2 3 3 4 5 5
The lu:
a a a a a a a a a
a a a a a a a a a
a a a a a a a a a
a a a aj aj aj aj aj aj
a a au au au au au au au
a a au au au aud aud aud aud
a a au au aug aug aug aug aug
a a au au aug aug aug aug aug
a a au au aug aug aug aug aug1
a a2 a2 a2 aug aug aug2 aug2 aug2
a a2 a2 a2 aug aug aug2 aug23 aug23
The lenght:5
The str:aug23