关于动态规划之前刷过一些相关的题,但都是类似背包问题、爬楼梯问题,那时候觉得这个算法挺简单。直到最近在看jieba的源码,其中两次使用到动态规划,一次是很有名的viterbi算法,另一次是在有向无环图中查找最优分词序列时。在看这两部分的源码时感觉自己对动态规划的理解太过浅薄,于是重新翻看《算法导论》的第15.3节----动态规划原理。觉得理解了一个问题为什么能够使用动态规划?拿到一个问题时,如何判断是否应该使用动态规划?对于书中的一些关键点做一些记录。
最优子结构
- 如果一个问题的最优解包含其子问题的最优解,我们就称此问题具有最优子结构
- 一个问题具有最优子结构,可能使用动态规划方法,也可能使用贪心方法。所以最优子结构只是一个线索,不是看到有最优子结构就一定是用动态规划求解
- 发掘最优子结构的通用模式:
- 证明问题最优解的第一个组成部分是做出一个选择,做出这次选择会产生一个或多个待解的子问题
- 对于一个给定问题,在其可能的第一步选择中,你假定已经知道哪种选择才会得到最优解。你现在并不关心这种选择具体是如何得到的,只是假定已经知道了这种选择
- 给定可获得最优解的选择后,你确定这次选择会产生哪些子问题,以及如何更好的刻画子问题空间
- 利用“剪切-粘贴”技术证明:作为构成原问题最优解的组成部分,每个子问题的解就是它本身的最优解。
- 对于不同问题领域,最优子结构的不同体现在两个方面:
- 原问题的最优解中涉及多少个子问题
- 在确定最优解使用哪些子问题时,我们需要考察多少种选择
- 动态规划与贪心的区别:
- 动态规