hdu 1159,最大公共子序列 LCS

比较基本的动态规划
网上的资料都说得比较详细,觉得其实直接看代码会比较直观易懂
代码较短,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;
	}
}





猜你喜欢

转载自blog.csdn.net/hqw11/article/details/50933829