美文网首页
(6)动态规划(上) LCS

(6)动态规划(上) LCS

作者: 陈码工 | 来源:发表于2016-11-08 11:42 被阅读0次

LCS

问题描述: 在两个给定的序列中, 找出最长的公共子序列(Largest Common Sequence), 比如LCS(ABDCAC, BAACDC) = BCC(解不唯一);

分析

  1. 最优子结构
    这个问题是具有最优子结构的特性的, 也就是说最后一阶段的那个大的结构, 是包含了前面的最优子结构的. 在LCS问题中, 最后最大的结构可以看成是A[m-1]和B[n-1]两个子序列, 再加上最后的a, b两个元素. 此时我们应该已经得到了LCS(A[m-1], B[n-1]), 那么最后阶段我们的决策就是要不要再延长这个子序列;

  2. 递归式
    LCS(A[m], B[n]) =
    if a == b,
    LCS(A[m-1], B[n-1]) + a
    if a!=b
    max { LCS(A[m-1], {B[n-1]+b} ), LCS( {A[m-1]+a}, B[n-1]) }
    写得更简洁一些:
    c(i, j) = //Common, 返回值是LCS有多少个char
    (1) c(i-1, j-1) +1 , A[i] == B[j]
    (2) max{c(i-1, j), c(i, j-1)} , A[i] != A[j]
    (3) 0 , 边界条件i==0 || j==0 即出现有一条序列是长度为0的, 那么肯定公共序列长度为0;

  3. 自底向上计算的算法

//输入: X, Y为两条序列
LCS(X[1~m], Y[1~n])
//初始化
let c[1~m][1~n] and rec[1~m][1~n] be new tables
for (i = 0~m)
    c[i][0] = 0
for (j = 0~n)
    c[0][j] = 0
//开始计算
for (i= 1~m)
    for (j= 1~n)
        if (X[i] == Y[j]) 
            c[i][j] = c[i-1][j-1] + 1
            rec[i][j] = 1 (↖️)
        else if (c[i-1][j] >= c[i][j-1])
            c[i][j] = c[i-1][j]
            rec[i][j] = 0 (↑)
        else 
            c[i][j] = c[i][j-1]
            rec[i][j] = 2 (←)
return c and rec
Print-LCS(rec[1~m][1~n], X[1~m], i, j)
if i==0 or j==0
    return 
if rec[i, j] == 1 (↖️)
    Print-LCS(rec, X, i-1, j-1)
    printf (X[i])    //因为讲求顺序, 因此从后往前找的时候, 先发现的后打印, 才能形成正确的顺序;
if rec[i, j] == 0 (↑)
    Print-LCS(rec, X, i-1, j)
else  (←)
    Print-LCS(rec, X, i, j-1)

相关文章

  • (6)动态规划(上) LCS

    LCS 问题描述: 在两个给定的序列中, 找出最长的公共子序列(Largest Common Sequence),...

  • LCS:最长公共子序列

    LCS(最长公共子序列)是动态规划里的一道经典的问题。动态规划

  • LCS动态规划

    相关笔记 思路 在给定的输入中寻找最优可能,可以通过动态规划实现。需要在一个未排序的序列中找到满足要求的最长序列,...

  • 深度透析最长公共子序列算法

    最长公共子序列(Longest Common Subsequenen, LCS) 1、概念 动态规划(dynami...

  • 动态规划问题-LCS

    LCS 最长公共子序 如下 x 和 y 的最长公共子序长度为为 7 公式 实现 代码

  • 最长公共子序列

    最长公共子序列(Longest Common Subsequence,简称 LCS)是非常经典的动态规划题目。通常...

  • 【动态规划】LCS算法 python

    问题描述1求两字符串的连续最大公共子字符串(The Longest Common Substring)这个LCS问...

  • 动态规划(DP问题)

    目录 1. 概念2. 分治与动态规划3. 求解问题的特点4. 步骤5. 斐波那契数列6. 最长公共子序列(LCS)...

  • 动态规划、LCS、01背包问题

    动态规划:将一个具有最优子结构性质的问题分成若干个子问题,在求解过程中,记录下子问题的结果,存储在一个表格中,使得...

  • 动态规划--最长公共子序列

      动态规划是解决一类问题的方法,而不是某种固定的算法。 eg: 求最长公共子序列(LCS: Longest Co...

网友评论

      本文标题:(6)动态规划(上) LCS

      本文链接:https://www.haomeiwen.com/subject/uisauttx.html