Dynamic Programming--Longest Common Subsequence

来源:互联网 发布:守望先锋安卓数据查询 编辑:程序博客网 时间:2024/06/02 04:40

问题描述:给定两个序列: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;  elsedp[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];}


0 0