算法导论15-3

读书笔记

本小节讲述了两点内容:

  1. 合适动态规划算法解决的最优化问题的两个要素
  2. 备忘方法在动态规划中的作用

两个要素

最优子结构

一个问题的最优解包含其子问题的最优解

还有一点值得注意,同时还需要满足子问题无关的特性:同一个原问题的一个子问题的解不影响另一个子问题的解。

重叠子问题

某一个子问题可能会被包含在多个问题中,被反复求解。

备忘机制

重构最优解

备忘录常常不仅仅存储子问题的代价,还需要存储子问题最优解的选择过程。

就像是在矩阵链中,我们不仅保存了代价,还保存了括号划分点;

备忘

由于动态规划算法解决的问题具有重叠子问题的性质,所以备忘机制存储已经求解过的子问题的解,极大地降低了时空代价。

课后练习

15.3-1

对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种方法是穷举所有可能的括号化方案,对每种方案计算乘法运算次数;第二种方法是运行\(RECURSIVE-MATRIX-CHAIN\)。证明你的结论。

毫无疑问,第二种方法更高效。

15.3-2

对一个\(16\)个元素的数组,画出\(2.3.1\)节中\(MERGE-SORT\)过程运行的递归调用树。解释备忘技术为什么对\(MERGE-SORT\)这种分治算法无效。

因为没有子问题重叠。

15.3-3

考虑矩阵链乘法问题的一个变形:目标改为最大化矩阵序列括号化方案的标量乘法运算次数,而非最小化。此问题具有最优子结构吗?

具有最优子结构。

15.3-4

如前所述,使用动态规划方法,我们首先求解子问题,然后选择哪些子问题用来构造原问题的最优解。\(Capulet\)教授认为,我们不必为了求原问题的最优解而总是求解出所有的子问题。她建议,在求矩阵链乘法问题的最优解时,我们总是可以在求解子问题之前选定\(A_iA_{i+1}..A_j\)划分位置\(A_k\)(选定的\(k\)使得\(p_{i-1}p_k p_{j}\)最小)。请找出一个反例,证明这个贪心方法可能生成次优解。

//todo

15.3-5

\(15.1\)节的钢条切割问题加入限制条件:假定对于每种钢条长度\(i(i=1,2,...,n-1)\),最多允许切割出\(l_i\)段长度为\(i\)的钢条。证明:\(15.1\)节所描述的最优子结构性质不再成立。

子问题的最优解切割出的长度为\(i\)的钢条数量可能超出\(l_i\)

posted @ 2021-01-15 14:16  ijkzen  阅读(514)  评论(0编辑  收藏  举报