动态规划
将大规模的问题 转化为 小规模的问题,并且缓存中间结果。
递归:自己调用自己,也就是枚举所有情况,暴力解,这时候就必须加以优化。
动态规划:一种优化方式,递归过程中添加一些缓存,进行剪支,从而优化。
举例:
分析得到 就是 给定一个不定长数组,选取若干个 不相邻的 数组 并且要求所选数组的和最大!
当我选择了4号节点,你就不可以选择3号节点,你就可以考虑2号节点,当你选择了xxx 你就xxx
所以你可以得到的递归树
还需要记录每一个节点的时候的和。
递归树
递归三部曲:
- 选择递归函数的参数:
- 终止条件:
- 递归方向:
优化思路:
发现了相同的部分
此处把 9这个数值的节点存起来
(记忆数组)
动态规划的解题思路
基本上所有的动态规划的题目都可以由递归式子进行转换
递归方向式子 就和 状态转移式子一样。
basecase 就是 终止条件
实现:
时间复杂度On 无法优化
空间复杂度On 发现每次是需要知道前两个dp
所以 把数组 优化为两个变量
总结:
https://www.bilibili.com/video/BV1J54y1p7nd