算法导论15-3
读书笔记
本小节讲述了两点内容:
- 合适动态规划算法解决的最优化问题的两个要素
- 备忘方法在动态规划中的作用
两个要素
最优子结构
一个问题的最优解包含其子问题的最优解
还有一点值得注意,同时还需要满足子问题无关的特性:同一个原问题的一个子问题的解不影响另一个子问题的解。
重叠子问题
某一个子问题可能会被包含在多个问题中,被反复求解。
备忘机制
重构最优解
备忘录常常不仅仅存储子问题的代价,还需要存储子问题最优解的选择过程。
就像是在矩阵链中,我们不仅保存了代价,还保存了括号划分点;
备忘
由于动态规划算法解决的问题具有重叠子问题的性质,所以备忘机制存储已经求解过的子问题的解,极大地降低了时空代价。
课后练习
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\)。