一、动态规划题目特点
1、计数
- 有多少种方式走到右下角
- 有多少种方法选出k个数使得和是sum
2、求最大值最小值
- 从左上角走到右下角路径的最大数字和
- 最长上升子序列长度
3、求存在性
- 取石子游戏,先手是否必胜
- 能不能选出k个数使得和是sum
二、动态规划题目解法组成部分
组成部分一:确定状态
- 状态在动态规划中的作用属于定海神针
- 简单的说,解动态规划的时候需要开一个数组,数组的每个元素 f[i] 或者 f[i][j] 代表什么
–类似于解数学题中,X、Y、Z的代表什么 - 确定状态需要两个意识
–最后一步
–子问题
举个例子:
现有三种硬币,面值分别为2、5、7,每种硬币足够多。现在买一本书需要27元,如何用最少数量的硬币组合正好付清,不需要对方找钱?
解:
如果这个问题用递归解法:
组成部分二:转移方程
组成部分三:初始条件和边界情况
组成部分四:计算顺序
三、例题
存在性问题一
问:有n块石头分别在x轴的0,1,…,n-1位置。一只青蛙在石头0上面,想跳到石头n-1上面;如果青蛙在第i块石头上,它最多可以向右跳距离ai。青蛙能否跳到石头n-1上面?
- 例子1:
– 输入a = [2,3,1,1,4]
– 输出 True - 例子2:
– 输入a = [3,2,1,0,4]
– 输出 False
解
:
首先确定状态:
然后化成子问题:
构建转移方程:
分析初始化条件和边界情况:
选择计算顺序: