1.过渡:记忆化搜索过度动态规划
动态规划分为两种:
1.递归DP:使用记忆化搜索等方法,自顶向下进行递归解题
2.递推DP:使用循环与状态转移方程,自底向上进行递推解题
动态规划五步骤:
1.确定状态表示:给dp数组赋予一个含义
2.确定状态转移方程:将当前格子如何由其他格子推导出来的方程求出
3.初始化:将初始情况填上,比如斐波那契数列中的第一和第二个值
4.确定填表顺序:根据题意和方程确定按照什么顺序填值
5.确定最终结果:根据计算结果和题意得出最终结果
例题:
2.线性dp
**特点:**状态只依赖于前一个或者前几个状态,状态之间的关系是线性的,通常可以用一维或者二维数组存储
2.1基础线性dp
例题:
2.算法题(200):最大子段和(动态规划)_用动态规划法 求最大子段和 练习题-CSDN博客
2.2路径类dp
是线性dp的一种,在一个n*m的矩阵中设置一个行走规则,研究从起点走到终点的方案数,最大路径和或最小路径和
例题:
1.算法题(203):矩阵最小路径和_走矩阵从(1,1) 走到(n,n),每条路径上最的值相比最小的路径值-CSDN博客
2.3经典线性dp
主要是最长上升子序列和最长公共子序列
算法题(207):最长上升子序列(经典线性dp题)_最长上升子序列练习题-CSDN博客
3.背包问题
**场景:**给定一组物品,每个物品有各自的体积和价值,在不超过背包体积的情况下,使得背包中的物品价值最大
3.1 01背包
例题:
3.2 完全背包
**完全背包:**n种物品,每一种物品的个数是无限多的,要求满足背包/时间要求的前提下,使背包物品价值最大
**核心:**需要记住如何推导状态转移方程,在可任意数量选择物品的情况下
分三种类型:
小于等于,恰好等于,大于等于
其中小于等于的初始化都为0即可
恰好等于可能存在非法情况,要按需初始化为正无穷或负无穷,多数为负无穷(求max)
大于等于情况下,有可能存在非法情况,也要按需初始化为正无穷或负无穷
多数为正无穷(求min),还需要注意由于dp数组下标不可为0,存在部分情况数组映射
例题:
3.3 多重背包
应用场景:物品限量但是不全为1的背包问题
注意:由于物品限量,不一定可以让整个背包超重,所以不能使用完全背包的优化方程
解决方案:状态转移方程直接根据物品的限量数进行for循环遍历计算即可
例题:
3.4 分组背包
**场景:**物品具有小组特性,一个小组的物品只能选择一个
注意:状态转移表示中,第一个参数表示的是组,而不是单独的物品,因为组内存在互斥
例题:
4.区间dp
**核心思想:**将大区间划分为小区间
**注意:**区间dp的遍历方式是特殊的,第一层是len从1~n,第二层是左端点从2~n-len+1
应用场景:涉及两端的变化的情况
模板题:
例题: