【问题标题】:Deriving the subsolution table for LCS from the brute force solution从蛮力解决方案导出 LCS 的子解决方案表
【发布时间】:2018-01-13 08:55:19
【问题描述】:

我正在使用动态编程解决 LCS 问题。我在不查看解决方案的情况下自己推导 DP 解决方案时遇到了麻烦。

我目前推断给定两个字符串,P 和 Q:

  • 我们可以枚举出大小为2^n的P的所有子序列。
  • 我们还可以枚举Q的所有子序列,其大小为2^m

因此,如果我们要检查共享子序列,则运行时间将是 O(2^n * 2^m)O(2^(n+m))

我不明白我们如何从这种蛮力解决方案转到动态编程解决方案。子解表的推导逻辑是什么?

我只是不明白我们如何从这一点直接跳到 DP 的子解决方案表。这样做的逻辑是什么?

我了解我们需要确定重叠的子解决方案。但是我找不到一个很好的解释来识别这个然后进入子解决方案表。

让我知道这个问题是否有意义。

【问题讨论】:

  • 一旦你了解了基础知识,它就非常简单了。
  • 是的,每个人都告诉我,说实话我无法理解。 (不看解决方案)。我试图完全从头开始,我觉得自己像个小丑。
  • 所以你没看懂我的回答??

标签: algorithm dynamic-programming


【解决方案1】:

以下是为该算法创造魔力的基本思想。

考虑 2 个字符串 S1S2

S1 = c1,c2,c3,........cm, length = m

S2 = b1,b2,b3,........bn, length = n

假设你有一个函数LCS(arg1,arg2),其中

arg1 = S1,m , string S1 of length of m

arg2 = S2,n ,长度为 n 的字符串 S2

LCS(arg1,arg2) 将为我们提供两个参数的最长公共子序列的长度。

现在假设两个字符串的最后一个字符相同。

bn = cm

假设没有其他两个字符是相同的。这意味着:

LCS(arg1,arg2) = 1(last character) + 0(remaining strings)

现在,如果您已经理解了上面的等式,那么很明显,如果不是没有其他两个字符匹配我们确实有匹配的东西(在剩余的字符串中),那么:

LCS(arg1,arg2) = 1(last character) + LCS(arg1 - cm,arg2 - bn)(Remaining strings)

但是如果最后两个字符不匹配,那么肯定我们必须考虑每个字符串中的倒数第二个字符,这就是为什么我们在 最后 2 个字符不匹配:

LCS(arg1,arg2) = max(LCS(arg1 - cm,arg2) , LCS(arg1 ,arg2 - bn))

【讨论】:

  • 我不明白这一行:LCS(arg1,arg2) = 1(last character) + 0(remaining strings) 1 是最后一个字符的函数?
  • 或者你的意思是LCS(arg1,arg2) = 1?
  • 1(last character) 是什么意思?
  • 哥们我不明白
  • @echo 表示 LCS(arg1,arg2) = 1。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多