思路:dp[i][j],其中i,j表示第一个字符串的前i个字符和第二个字符串的前j个字符串的最大公共子序列。
#include<iostream>
#include<cstring>
using namespace std;
char a[1000],b[1000];
int dp[1001][1001];
int main()
{ int i,j,la,lb;
while(cin>>a>>b)
{ la=strlen(a);
lb=strlen(b);
for(i=0;i<la;i++) //对dp[][]进行初始化
for(j=0;j<lb;j++)
dp[i][j]=0;
for(i=0;i<la;i++) //注意:la要和和其数组相对应,la对应a。。。
for(j=0;j<lb;j++)
if(a[i]==b[j])dp[i+1][j+1]=dp[i][j]+1; //当a[i]=b[j]表示最大公共子序列长度曾加1
else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); //获得最大公共子序列
cout<<dp[la][lb]<<endl;
}return 0;
}