动态规划
背景:
从递归到记忆化搜索再到动态规划:
递归思路:
方法论
通过引入动态规划的逻辑,来解决动态规划的问题:首先从递归出发,写出递归表达式,根据递归表达式,得到记忆化搜索,再有记忆化搜索翻译为递归(去掉递归中的递的过程)(结合198.打家劫舍来理解):
- dfs(i,j) => dp数组
- 递归 => 循环
- 根据递归边界初始化数组
- dp数组以及下标含义
- 递推公式
- 遍历顺序:前后顺序,内外顺序
- 数组初始化,结合前三者
- 打印dp数组:验证,找错
动态规划模型
小结:0-1背包与完全背包模型是对递归中枚举该元素选或者不选两种选择对最终目标造成的影响的总结,两者的区别在于01背包中的物品只能选一次,而完全背包的物品的选择则没有次数限制
总结
记忆化搜索即在递归过程中,缓存递归返回的结果,每次进入递归之前判断该结果是否已经计算过了。而在递归过程中,通常是在归的过程计算答案,放入缓存。由此,省去递的过程,直接从头循环开始推到,得到归的最终结果,这个就是动态规划的思想。通常递归的与动态规划的时间复杂度是相同的,因为他们都是搜索,而动态规划是自底向上的,递归通常是自顶向下的。在空间复杂度上,动态规划通常可以做到优于递归,因为递归需要隐式的记录返回位置,而动态规划的状态转移方程往往只涉及有限的数组。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |