最长公共子序列,设dp[i][j]为X序列前i个元素和Y序列前j的元素所能构成的最长公共子序列;
状态转移方程:
{
0 i=j=0;
dp[i][j]= dp[i-1][j-1]+1 X[i]=Y[j];
max(dp[i-1][j],dp[i][j-1]) else
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int main()
{
string a,b;
int dp[1001][1001],i,j;
cin>>a>>b;
memset(dp,0,sizeof(dp));
for(i=1;i<=a.length();i++)
{
for(j=1;j<=b.length();j++)
{
if(a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[a.length()][b.length()]<<endl;
return 0;
}