DP总览
问题特色
计数(多少种)
- Li114,多少种路径
- 多少种方法选出k个数,使得和是sum
最大值
- Li669,硬币的最少个数
- Li397,最长上升子序列
存在性(可行性、可否)
解题步骤
-
肯定状态数组
- 考虑最后一步(最后一个物品,最后一个路径)
- 变成解决子问题了(规模更小的问题)
- 状态就是 f 对应的 dp
-
肯定状态转移方程优化
- ❗ dp[i] 和 f(i) 不彻底同样
P2O_2e 14
,Li515
- dp[i]的计算顺序(从大到小仍是从小到达)有影响
0-1背包
-
分析初始条件和边界状况编码
- 初始条件:开始的几项,和后面规则不同的值
- 边界状况:数组下标越界时,没法实现的状况的dp值(-1,无穷仍是什么)
-
肯定计算dp的顺序code
- 原则就是计算须要的都是以前计算的结果
- 通常都是从小到大,背包问题的空间优化必须反向计算
空间优化
- 使用滚动数组, 根据状态转移方程中须要的最旧的数据肯定大小
- 用
dp[i % n]
代替dp[i]是最方便, 最好理解的解决办法, 其中n是压缩后的数组大小
- 通常是逐行扫描, 滚动数组长度是列数的倍数。 若是列多行少时, 能够考虑逐列扫描让滚动数组长度是列数的倍数, 进一步优化空间
坐标型20%
简单例题
Li114 不一样路径for循环
Li115 不一样路径,网格中有障碍循环
问题特色
Li397 最长连续单向子序列co
Li110 路径数字和的最小值block
Li553 炸弹袭击
序列型20%
简单例题
Li515 刷房子
问题特色
- 状态dp[i]的含义是前i个元素的性质
- 初始化时,dp[0]表示空序列的性质
- ❗ for循环里
i <= n
, 常常写成i < n
,致使输出0
Li556 刷房子, O(n*k)
Li644 数位中1的个数
L198_Li392 打家劫舍
划分型20%
简单例题
Li512 编码解析方法
区间型15%
背包型10%
载重W的背包,N件待选物品,物品属性:重量w,价值v
0-1背包
列表中的物品只有一个
彻底背包
列表种的物品有任意个
最长序列型5%
博弈型5%
综合型5%