我正在经历CLRS引入算法中最长的常见子序列问题。但我无法理解它背后的思维过程。解释的大多数其他问题非常直观,我相信我可以在将来解决类似的问题,但我无法想象LCS问题,因为我不理解如何确定最佳子结构背后的逻辑。
本书给出了最优子结构的以下解释
**定理15.1(LCS的最佳子结构)
设X ==和Y ==为序列,设Z =
是X和Y的任何LCS。
1.如果xm = yn
,则zk = xm = yn
和Zk−1
是Xm−1
和Yn−1
的LCS。
2.如果xm != yn
,则zk = xm
表示Z
是Xm−1
和Y
的LCS。
3.如果xm != yn
,则zk = yn
表示Z
是X
和Yn−1
的LCS。
证明(1)如果zk != xm
,我们可以将xm = yn
追加到Z
以获得共同点
长度X
的{{1}}和Y
的子序列与k + 1
的假设相矛盾
Z
和X
的最长公共子序列。因此,我们必须Y
。
现在,pre fi x zk = xm = yn
是Zk−1
和length-(k − 1)
的{{1}}公共子序列。
我们希望证明它是一个LCS。假设为了矛盾的目的
Xm−1
和Yn−1
的共同子序列W
的长度大于Xm−1
。
然后,将Yn−1
追加到k−1
会产生xm = yn
和W
的公共子序列
其长度大于X
,这是一个矛盾。
(2)如果Y
,则k
是zk != xm
和Z
的公共子序列。如果有的话
Xm−1
的常见子序列Y
和长度大于W
的{{1}},然后Xm−1
也是Y
和k
的共同子序列,与W
的假设相矛盾
是Xm
和Y
的LCS。
(3)证明与(2)对称。**
证据很清楚,但我看不出他们是如何想出最佳子结构的。 有人可以帮忙吗?
答案 0 :(得分:0)
请仔细阅读以下链接的重复部分:
https://en.wikipedia.org/wiki/Longest_common_subsequence_problem#LCS_function_defined
这些递归关系只不过是最优的子结构和重叠的子问题等式。