比较基本的动态规划
网上的资料都说得比较详细,觉得其实直接看代码会比较直观易懂
代码较短,dp[i][j]表示X的i位和Y的j位之前的最长公共子序列的长度,X和Y是输入的两个序列
#include<iostream>
#include<string.h>
using namespace std;
#define MAXN 1001
#define mst(s,t) memset(s,t,sizeof(s))
int dp[MAXN][MAXN];
char str1[MAXN];
char str2[MAXN];
int len1,len2;
int main(){
while(cin>>str1>>str2){
mst(dp,0);
len1=strlen(str1);
len2=strlen(str2);
//一开始马上想到的是以X、Y序列的两个前子序列的长度和为顺序,例如先算所有和(i)为2的,然后和为3的,为4的( (1,3),(2,2),(3,1) )…
for(int i=2;i<=len1+len2;i++){
for(int j=1;j<i&&j<=len1;j++){
if(str1[j-1]==str2[i-j-1])
dp[j][i-j]=dp[j-1][i-j-1]+1;
else dp[j][i-j]=max(dp[j-1][i-j],dp[j][i-j-1]);
}
}
//实际上这也是可行的顺序,这样就可以
// for(int i=1;i<=len1;i++)
// for(int j=1;j<=len2;j++) {…}
cout<<dp[len1][len2]<<endl;
}
}