动态规划笔记(贝尔曼算法)
目录
动态规划满足最优化原理和无后效性
动态规划三种题型
1.计数
- 有多少种方式走到右下角
- 有多少种方法选出k个数使得和是Sum
2.求最大最小值
- 从左上角走到右下角路径的最大数字和
- 最长上升子序列长度
3.求存在性
- 取石子游戏,先手是否必胜
- 能不能选出k个数使得和是Sum
动态规划四个组成部分
1.确定状态
-
状态在动态规划中的作用属于定海神针
-
简单的说,解动态规划的时候需要开一个数组,数组的每个元素
f[i]
或者f[i][j]
代表什么类似于解数学题中,X,Y,Z代表什么
-
确定状态需要两个意识:
-
最后一步 保证最后一个问题减小规模问题不变,且结论不矛盾
-
子问题:问题一样,规模变小
-
-
研究最优策略的最后一步化为子问题
2.转移方程
根据子问题直接得到
3.初始条件和边界条件
不重不漏(易说不易做 )
4.计算顺序
自顶向下或自底向上,整体思路的体现,即能利用之前的结果进行计算,去掉重复计算的步骤
神奇的注意点(动规五部曲)
- dp数组以及下标的含义?二维一维数组中的i、j是什么意思
- 递推公式,不言而喻
- dp数组的初始化
- 遍历顺序(0/1背包问题为什么要先遍历背包后遍历物品,反过来是否可以;完全背包问题排列和组合for循环不同)
- 打印dp数组,用于debug,清晰思路
动态规划基本类型
- 坐标型:dp数组下标为原来坐标,代表题型UniquePath
- 序列型:dp数组下标为前i个,错开一个
- 划分型:划分数组,每组满足一定性质
- 区间型:用
f[i][j]
解决 - 背包型:各种背包装载问题(区间)
- 最长子序列型:dp数组下标为原来坐标,代表题型最长上升子序列
- 博弈型:计算必胜或必败
- 综合型:综合前面两种(如区间+博弈、动态+划分)或动态和其他算法(如动态+二分查找、动态+子母树 )
动态规划时间空间优化
Follow Up常考
- 滚动数组
- 降维
动态规划打印路径(解)
动态规划基本题型
- 动归基础
- 斐波那契额数列
- 爬楼梯问题
- 背包问题
- 打家劫舍
- 树形dp(leetcode就三道题)
- 股票问题
- 买卖时间最大利润
- 子序列问题
- 最长子序列
- 最长连续递增子序列
- 编辑距离问题,两个字符串,最小编辑数使字符串相等。