#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int F[1001][1001];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
string x,y;
int i,j;
int l1,l2;
while(cin>>x>>y)
{
l1=x.size();
l2=y.size();
memset(F,0,sizeof(F));
for(i=0;i<l1;i++)
{
for(j=0;j<l2;j++) //状态转移
{
if(x[i]==y[j])
{
F[i+1][j+1]=F[i][j]+1;
}
else
{
F[i+1][j+1]=max(F[i+1][j],F[i][j+1]);
}
}
}
cout<<F[l1][l2]<<endl;
}
return 0;
}
最大公共子序列的求解思路就是从一序列开始,每个字符与第二列的每个字符相比较,通过状态转移方程
x[i]==y[i]? F[i][j]=F[i-1][j-1]+1:F[i][j]=max(F[i][j-1],F[i-1][j])来延长最长的一条公共序列。
代码写成如上用i+1,j+1代替i,j就可以比较轻松地解决边界问题