LCS 的最优子结构 证明
(LCS 的最优子结构)定理:令 X=⟨x1,x2…xm⟩ 和 Y=⟨y1,y2…yn⟩ 为两个序列,Z=⟨z1,z2…zk⟩ 为 X 和 Y 的任意 LCS。
- 如果 xm=yn,那么 zk=xm=yn 且 Zk−1 是 Xm−1 和 Yn−1 的一个 LCS。
- 如果 xm≠yn,那么 zk≠xm 意味着 Z 是 Xm−1 和 Y 的一个 LCS。
- 如果 xm≠yn,那么 zk≠yn 意味着 Z 是 Yn−1 和 X 的一个 LCS。
证明:
- 如果 zk≠xm,那么可以将 xm 和 yn 添加到 Z 的末尾,得到 X 和 Y 是一个长度为 k+1 的子序列,与 Z 是 X 和 Y 的最长公共子序列的假设矛盾。因此必然有 zk=xm=yn。这样前缀 Zk−1 是 Xm−1 和 Yn−1的公共子序列,我们希望他是一个 LCS。利用反证法,假设存在 Xm−1 和 Yn−1 的一个长度大于 k−1 的公共子序列 W,则将 xm=yn 追加到 W 的末尾会得到一个长度大于 k 的公共子序列,矛盾。
- 如果 zk≠xm,那么 Z 是 Xm−1 和 Y 的一个公共子序列。如果存在 Xm−1 和 Y 的一个长度大于 k 的公共子序列 W,那么 W 也是 Xm 和 Y 的公共子序列,与 Z 是 X 和 Y 的最长公共子序列矛盾。
- 与情况二对称。
其递归算法具有重叠子问题的性质,为了求 X 和 Y 的一个 LCS,我们可能需要求 X 和 Yn−1 的一个 LCS,但是这几个子问题都包含求解 Xm−1 和 Yn−1 的 LCS 的子子问题。很多其他问题也都共享子子问题。
定义 fi,j 表示 Xi 和 Yi 的 LCS 的长度。如果一个序列长度为 0,那么 LCS 的长度为 0,可以得到以下公式:
fi,j={0若i=0或j=0fi−1,j−1+1若i,j>0且xi=yjmax
参考文献:算法导论(第三版)。机械工业出版社。