一、动态规划 DP 基础概念
- DP 核心思想
动态规划:把大问题拆成重叠的子问题,保存子问题答案避免重复计算,不需要重复递归。
三大核心要素:DP数组定义、递推公式、初始化,再加遍历顺序、结果取值。
- DP 数组定义
一句话:dpi 代表第 i 个状态下,我们想要的答案。
dp 数组含义必须先写清楚,定义错了,后面全错。
示例:一维 dp,dpi = 考虑前 i 个物品时能得到的最大价值。
- 递推公式(状态转移方程)
子问题之间的推导关系,把旧状态推导出新状态,DP 最关键部分。
比如 01 背包:dpj = max(dpj, dpj - weight\[i] + valuei);
含义:不选当前物品,就是dpj;选当前物品,容量减少 weight i,价值加上 value i,取两者最
大值。
- DP 四步解题模板
1、确定 dp 数组以及下标的含义
2、确定递推公式(状态转移方程)
3、dp 数组如何初始化(初始值,边界条件)
4、确定遍历顺序(一维 01 背包:物品正序,容量倒序!)
二、背包入门(01 背包,最基础)
01 背包:每个物品只能选 1 次或者不选,不能重复选。
完全背包:物品可以选无限次(后面再学,入门先学 01 背包)
01 背包重点
物品:weight \[\] 重量,value \[\] 价值;背包总容量 bagSize
dp 一维数组定义:dpj:背包容量为 j 时,能装的最大价值
递推公式:dpj = max(dpj, dpj - w + v)
遍历顺序:容量 j 从后往前倒序遍历!
倒序:保证每个物品只用一次(01 背包)
如果正序,物品会被重复选取,变成完全背包
初始化:dp 数组全部初始化为 0。容量 0,价值就是 0。
01 背包选择:两种情况
1、 不拿当前物品:dp j 不变
2、拿当前物品:背包腾出 w i 空间,加上当前物品价值 v i