【问题标题】:How to use DP to solve "Longest similar subsequence"如何使用DP求解“最长相似子序列”
【发布时间】:2017-10-18 06:28:41
【问题描述】:

我已阅读 LCS 问题的解决方案。但是现在有一个最长相似子序列问题:序列C是两个序列A,B的相似子序列当且仅当C是A的子序列并且我们最多可以替换C中的K个元素使得C是B的子序列.

例如,如果A = "ABCDE", B = "BCAFE", K = 1,那么最长相似子序列是"BCDE"("BCDE是"ABCDE"的子序列,我们可以替换'D'使用 'A' 或 'F' 使其成为“BCAFE”的子序列)。

我的问题是我只是想出了一个递归的方法来解决它,但是显然这很耗时,所以我想用 DP 代替。知道如何使用 DP 来解决这个问题吗?

我的递归方法是这样的:

LSS(i, j, k)
    if(i == 0 or j == 0)
        return 0
    if(A[i] == B[j])
        return LSS(i-1, j-1, k) + 1
    if(k > 0)
        return max(LSS(i-1, j-1, k-1) + 1, LSS(i-1, j, k), LSS(i, j-1, k))
    else
        return max(LSS(i-1, j, k), LSS(i, j-1, k))

【问题讨论】:

    标签: algorithm dynamic-programming lcs


    【解决方案1】:

    DP 就是理解最优子问题,然后将其用于获得其他解决方案。没有所有这些细节,我们可以简单地使用自动出现的想法。

    我们在这里所做的只是一遍又一遍地计算相同的解决方案。这就是解决方案更耗时的原因。你能做的就是记住解决方案。

    所以在这种情况下,用 -1 初始化 sol。然后在获得 LSS(i,j,k) 的解决方案之前,您可以检查是否已经计算了 sol[i][j][k]。如果是,那么就使用它,否则解决解决方案并将其放入sol。标准记忆。

    【讨论】:

    • 谢谢。但是我想知道(我没有在问题中说清楚)有没有办法将其转换为二维问题并使用自下而上的 DP 来解决它?也就是说,摆脱 k 并使其与 LCS 问题非常相似?
    • @Einsambr.: 啊这个我得检查一下..我想有办法。
    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多