Dynamic Programming--Longest Common Subsequence

问题描述:给定两个序列:X[1...m],Y[1...n],求在两个序列中同时出现的最长序列的长度。(不必是连续的)

穷举法:x中的子序列有2^m个。

检查是否存在于Y中--O(n)。

时间显然是不能接受的。。。

动态规划:

设C[i,j] = |LCS(X[1...i],Y[1...j])|,C[i,j]表示序列X[1...i],Y[1...j]的最长LCS,则C[m,n]就是最后的答案。

C[i,j] = C[i-1,j-1] + 1      ……   X[i] == Y[j]

C[i,j] = max(C[i-1,j],C[i,j-1])    ……   X[i] != Y[j]

。。。。

int LCS (int lenstr,int lench)
{//返回LCS的长度
	memset(dp,0,sizeof(dp));
	int k;
	for (int i=1;i<=lenstr;i++)
	{
		k=i&1;
		for (int j=1;j<=lench;j++)  
			if (str[i-1] == ch[j-1])  
				dp[k][j]=dp[k^1][j-1]+1;  
			else
				dp[k][j]=max(dp[k][j-1],dp[k^1][j]);
	}
	return dp[k][lench];
}
有时候会求一个串,这两个串是这个串的子序列,求这个串的最小长度。

int lcs(){
    for (int i = 1;i <= len1;++i){
        for (int j = 1;j <= len2;++j){
            if (s1[i-1] == s2[j-1]) dp1[i][j] = dp1[i-1][j-1] + 1;
            else{
                dp1[i][j] = min(dp1[i-1][j],dp1[i][j-1]) + 1;
            }
        }
    }
    return dp1[len1][len2];
}


你可能感兴趣的:(Dynamic Programming--Longest Common Subsequence)