在学习了《算法导论》的动态规划章节后,对其总结下:
一、 动态规划的实现步骤
1. 找出问题的最优子结构
1) 寻找最优子结构时,可以遵循一种共同的模式:
a) 问题对的一个解可以是做一个选择
b) 假设对一个给定的问题,已知的是一个可以导致最优解的选择
c) 在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好的描述所得到的子问题空间
d) 利用一种“剪贴”技术,来证明一个问题的最优解中,其子问题也是最优的
2) 最优子结构在问题域中以两种方式变化:
a) 有多少个子问题被使用在原问题的一个最优解中,以及
b) 在决定一个最优解中使用哪些子问题时有多少个选择
3) 动态规划的时间复杂度
a) 其复杂度依赖于两个因素的乘积:子问题的总个数和每一个子问题有多少种选择。
b) 在装配线调度中,总共有O(n)个子问题,并且只有两个选择来检查每个子问题,多以执行时间为O(n)。
c) 对于矩阵链问题,总共有O(n*n)个子问题,每个子问题又之多有n-1个选择,因此执行时间是O()
2. 根据最优子结构,求递归解
3. 以自下而上的方式求出问题的最优解
4. 构造最优解路径
二、 动态规划的适用问题
1. 最优子结构
2. 重叠子问题
即用来解原问题的递归算法可以反复的解同样的子问题,而不是总在产生新的子问题
3. 问题:动态规划和分治法、贪心算法的区别
三、 动态规划的变形——备忘录
它既具有通常动态规划方法的效率,有采用自顶向下的策略。其思想就是备忘原问题的自然但低效的递归算法,主要是其维护了一个记录了子问题解的表,伪代码如下: