求两个字符串x,y的最长公共子序列
dp[i][j]表示x的前缀xi和y的前缀yj的LCS的长度
状态转移方程为:
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=Max{dp[i-1][j],dp[i],[j-1]};
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int Maxn=1005;
int f[Maxn][Maxn];
int main()
{
string s1,s2;
while(getline(cin,s1))
{
getline(cin,s2);
memset(f,0,sizeof(f));
for(int i=1;i<=s1.length();i++)
{
for(int j=1;j<=s2.length();j++)
{
if(s1[i-1]==s2[j-1])
f[i][j]=f[i-1][j-1]+1;
else
f[i][j]=max(f[i][j-1],f[i-1][j]);
}
}
cout<<f[s1.length()][s2.length()]<<endl;
}
return 0;
}