动态规划方法论
学习自b站动态规划四步解题法—搞定绝大多数类型动态规划题做的笔记
动态规划难点
- 类型多,没有固定模板
- 难度中上
- 多数面试题都会考到要求必须掌握
动态规划题目类型
以下这些问题大多数可以用动态规划去解决,但也不是绝对
- 计数
- 有多少种走到右下角的方法
- 有多少种方法可以选出k个数和为sum
- 求最大值(比重占最大80-90%题目可以用dp来解决)
- 求左上角走到右下角的路径的最大数字的和
- 最长上升子序列
- 求存在性
- 求取石子游戏,先手是否必胜
- 能不能选出k个数使和等于sum
第二种类型例子
动态规划四步走
- (一)确定状态
- 看最后一步(最优策略中使用最后一枚硬币A(k))
- 简化成子问题(用最少的硬币拼出更小的面值27-A(k))
- 定义状态f[i]代表i块钱最少使用的硬币数
- (二)转移方程
- f[x]=min(f[x-A(k)])
- A(k)为第k个硬币,根据题意有3种情况 A(k)=[2,5,7]
- f[x]=min(f[x-2],f[x-5],f[x-7])
- (三)初试条件和边界条件
- 如果状态不能从转移方程中求得并且它又需要有值,则要设置初值
- f[0]=0不能从转移方程中求得,则根据物理意义0块钱,需要的是0枚硬币
- 如果不能得到 i 则f[i]=MAX
- (四)计算顺序
- 原则:要计算一个新的状态时,其他状态要先于它计算出来
- 得出顺序为从小到大
- 如果要知道状态数组开几维,则要对比子问题和原问题的变化量。分别为f[27] 和f[27-A(k)] 一维