我已经阅读了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))
答案 0 :(得分:1)
DP就是了解最佳子问题,然后用它来获得其他解决方案。如果没有所有细节,我们可以简单地使用自动出现的想法。
我们所做的只是一遍又一遍地计算相同的解决方案。这就是解决方案耗时多了的原因。你能做的就是记住解决方案。
所以在这种情况下,使用-1初始化sol
。然后在获得LSS(i,j,k)的解之前,您可以检查是否已经计算了sol[i][j][k]
。如果它只是使用它,否则解决方案并将其放入sol
。 Standarrd备忘录。