您的位置:首页 > 产品设计 > UI/UE

Dynamic Programming--Longest Common Subsequence

2016-01-16 13:57 543 查看
问题描述:给定两个序列: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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: