动态规划的概念
-
状态:也就是DP数组的定义
-
状态转移
dp五部曲的理解
见:代码随想录
-
优先确定:状态的定义,状态转移的房产
-
根据状态转移方程确定:遍历顺序,初始化
状态压缩
-
本质上就是变量个数减少,状态定义更加简单
-
初始化和遍历顺序也要考虑
动态规划的定义理解:
重复子问题,状态,状态转移
- P1216 [IOI 1994] 数字三角形 Number Triangles
动态规划的起源:记忆化搜索
记忆化搜索本质是对回溯搜索的一种优化,很多时候先想到回溯,由回溯想到记忆化搜索,再想到动态规划
- P1434 [SHOI2002] 滑雪
- P4017 最大食物链计数
图搜索问题中的动态规划
- P1002 [NOIP 2002 普及组] 过河卒 :边界条件+数组拷贝
0-1 背包问题
背包问题的应用
经典背包问题
- P1048 [NOIP 2005 普及组] 采药
- P1802 5 倍经验日:这个背包问题需要考虑
dp[0]
的情况
价值等于重量:是否恰好装满背包
- 416. 分割等和子集
- 1049. 最后一块石头的重量 II
- 494.目标和
三维DP:
- 474. 一和零
完全背包问题
-
物体可以重复使用无限次
-
区别是:是否能利用刚更新的状态
-
转换为0-1背包问题
例题:
- 52. 携带研究材料(第七期模拟笔试)
- 518. 零钱兑换 II
- 322. 零钱兑换
- 279.完全平方数
背包问题的理解:遍历顺序
-
一般来说,先遍历背包还是物体,顺序不重要,更取决于递推公式。
-
对于一些问题(排列或组合),遍历顺序影响答案。
例题
- 377. 组合总和 Ⅳ:换顺序后,前面的物体有机会重新考虑(排序)
- 139.单词拆分:潜在考虑单词顺序
多重背包问题
-
多一重循环k,用于遍历使用次数
-
部分问题可以完全转换为0-1背包
-
倒序遍历j(参照0-1背包)
- P1077 [NOIP 2012 普及组] 摆花:不能直接转换为0-1背包
其他题:
- 198.打家劫舍:状态压缩:
dp[i][2]->dp[i]
- 213.打家劫舍II:初始化有问题,分类讨论。
- 337.打家劫舍 III:树上DP,使用 198.打家劫舍定义的类似状态:
dp[i][2]
,就能理解。当然这题也可以进行状态压缩!
线性动态规划
- P1115 最大子段和:引用背包问题的定义,维护虚假的序列和