最最基础的最长公共子序列问题。
dp[i][j]表示状态是a串前i个和b串前j个的最长公共子序列个数。
所以很容易可以推导出 这个递推公式 :
if(a[i]==b[j])
dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1]
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
string a,b;
int dp[550][550];
int main()
{
while(cin>>a>>b)
{
memset(dp,0,sizeof(dp));
int n=a.size();
int m=b.size();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i]==b[j])
dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
}
}
cout<<dp[n][m]<<endl;
}
}