如何使用DP来解决“最长的类似子序列”

时间:2017-10-18 06:28:41

标签: algorithm dynamic-programming lcs

我已经阅读了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))

1 个答案:

答案 0 :(得分:1)

DP就是了解最佳子问题,然后用它来获得其他解决方案。如果没有所有细节,我们可以简单地使用自动出现的想法。

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

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