动态规划题目特点
1. 计数
- 有多少种方式走到右下角
- 有多少种方法选出k个数使得和是sum
2.求最大最小值
- 从左上角走到右下角路径的最大数字和
- 最长上升子序列长度
3.求存在性
- 取石子游戏,先手是否必胜
- 能不能选出k个数使得和是sum
动态规划四个组成部分:
-
确定状态
- 研究最优策略的最后一步
- 化为子问题
-
转移方程
- 根据子问题定义直接得到
- 初始条件和边界情况
-
计算顺序
- 利用之前的计算结果
最值型动态规划
Coin Change
假设你有三种硬币,分别面值2元,5元和7元,每种硬币都有足够多,买一本书需要27元,如何用最少的硬币组合正好付清,不需要对方找钱。
动态规划组成部分一:确定状态
- 状态是动态规划的核心
- 解动态规划时需要定义一个数组,数组的每一个元素
f[i]
或者f[j][j]
代表什么 - 确定状态需要两个意识:
- 最后一步
- 子问题
最后一步
1-不知道最优策略,但最优策略肯定是K枚硬币面值加起来是27
2-所以肯定有一枚最后的硬币:
关键点1:不关心前面k-1
枚硬币如何拼出,甚至不知道
,但是确定了前面的硬币拼出了
关键点2:因为是最优策略,所以拼出的硬币数一定要最少,否则矛盾。
子问题
1 - 需要求出最少用多少枚硬币可以拼出
2 - 原问题是最少用多少枚硬币拼出27
3 - 原问题转化成了一个规模更小的子问题:
4 - 设状态
最后一枚硬币只可能是2,5或7
若,
应该是
(加上最后的一枚硬币2)
若,
应该是
(加上最后的一枚硬币5)
若,
应该是
(加上最后的一枚硬币7)
要求最少的硬币数:
动态规划组成部分二:转移方程
- 设状态
最少用多少枚硬币拼出
- 对于任意
,
动态规划组成部分三:初始条件和边界情况
-
时,
- 初始条件:
动态规划组成部分三:计算顺序
- 初始条件:
- 然后计算
- 大多数情况都是从小到大地算,这样当算
时,前面的
都已经算过了。
求最值型动态规划小结
-
1.确定状态
- 最后一步(最优策略中使用的最后一枚硬币
)
- 化成子问题(最少的硬币拼出更小的面值
- 最后一步(最优策略中使用的最后一枚硬币
-
2.转移方程
-
3.初始条件和边界情况
-
,如果不能拼出
,
-
-
4.计算顺序
计数型动态规划
Unique Paths
给定m行n列的网格,有一个机器人从左上角(0, 0)出发,每一步可以向下或者向右走一步,问有多少种不同的方式走到右下角
![]()
动态规划组成部分一:确定状态
- 最后一步:机器人走到右下角之前的最后一步:向右或者向下
- 右下角坐标为(m - 1, n - 1),那么前一步机器人一定是在(m - 2, n - 1)或者(m - 1, n - 2)
- 子问题 ——从左上角走到(m - 2, n - 1)和从左上角走到(m - 1, n - 2);假设从左上角走到(m - 2, n - 1)有
种方式,从左上角走到(m - 1, n - 2)有
种方式,那么走到(m - 1, n - 1)就有
种方式。
问题转化为机器人有多少种方式从左上角走到(m - 2, n - 1)和(m - 1, n - 2) - 状态:设
为机器人有多少种方式从左上角走到
动态规划组成部分二:转移方程
- 对于任意坐标
,
动态规划组成部分三:初始条件和边界情况
- 初始条件:
,机器人只有一种方式到左上角
- 边界情况:
,则前一步只能有一个方向过来
动态规划组成部分四:计算顺序
- 计算第0行:
- 计算第1行:
- 计算第m-1行:
- 答案是
时间复杂度和空间复杂度都是
存在性型动态规划
有
块石头分别在x轴的
位置,一只青蛙在石头
,想跳到石头
,如果青蛙在第
块石头上,它最多可以向右跳距离
,问青蛙能否跳到石头
。
动态规划组成部分一:确定状态
- 最后一步:如果青蛙能跳到最后一块石头
,考虑它跳的最后一步是从石头
跳过来的,
- 需要满足两个条件:1. 青蛙可以跳到石头
2.最后一步不超过跳跃的最大距离:
- 子问题——青蛙能不能跳到石头
- 状态:设
表示青蛙能不能跳到石头
动态规划组成部分二:转移方程
- 设
表示青蛙能不能跳到石头
,
动态规划组成部分三:初始条件和边界情况
- 设
表示青蛙能不能跳到石头
- 初始条件:
,青蛙一开始就在石头
动态规划组成部分四:计算顺序
- 初始化
- 计算
- 答案是
时间复杂度:,空间复杂度:
网友评论