【发布时间】:2012-06-25 13:09:28
【问题描述】:
我正在研究 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 和 Y 的子序列,长度为 k + 1,与 Z 的假设相矛盾
X 和 Y 的最长公共子序列。因此,我们必须有zk = xm = yn。
现在,前缀 Zk−1 是 length-(k − 1) 的公共子序列 Xm−1 和 Yn−1。
我们希望证明它是 LCS。假设为了矛盾的目的
Xm−1 和 Yn−1 的公共子序列 W 的长度大于 k−1。
然后,将xm = yn 附加到W 会产生X 和Y 的公共子序列
其长度大于k,这是矛盾的。
(2) 如果zk != xm,那么Z 是Xm−1 和Y 的公共子序列。如果有一个
Xm−1 和 Y 的公共子序列 W 的长度大于 k,那么 W 将
也是Xm 和Y 的公共子序列,这与Z 的假设相矛盾
是 X 和 Y 的 LCS。
(3) 证明与 (2) 对称。**
证明很清楚,但我看不出他们是如何提出最佳子结构的。 有人可以帮忙吗?
【问题讨论】:
标签: algorithm dynamic-programming