算法·动态规划
动态规划
-
状态表示,考虑用几维的状态来表示,背包问题一般为两维f(i,j),每一个状态的含义
- 集合(如选法集合)
- 所有选法
- 条件
- 只从前i个物品中选
- 总体积<=j
- 属性(如最大值,最小值,数量)
- 集合(如选法集合)
-
状态计算,如何能把每一个状态算出来
-
集合划分
-
如何把该集合划分成更小的子集,使得每一个自己都可以用前面更小的状态表示出来



- 不重复//个数不重复,最大值重复无所谓
- 不漏
-
-
-
DP优化一般是对动态规划的代码或者计算方程进行等价变形
-
DP的集合划分一般考虑最后一步怎么走
-
动态转移方程涉及到i-1的时候一般下标从1开始比较好
背包问题
总结
- 01背包
- N件物品,每件物品只能使用一次
- 完全背包
- n种物品,每种物品有无限件可以使用
- 多重背包
- n种物品,每种物品最多s件
- 分组背包
- n组物品,每组物品最多选一个
01背包
- N个物品和容量是V的背包,每个物品有体积V和重量W两个属性,每件物品使用1次,要么0次要么1次,求容量内最大价值之和
- 特点是每件物品最多只用一次
1 | |
1 | |
完全背包
- 每件物品可以用无限次

1 | |

1 | |
1 | |
多重背包问题
- 每个物品的个数不一样,有个数限制,既不是一件也不是无穷件,而是有一个具体的数值最多有Si个
- 有朴素版和优化版
朴素版
1 | |
1 | |
分组背包问题
-
物品有N组,每一组物品里有若干种,每一组里面最多选一种物品
-
分组背包是枚举第i组选哪个,多重背包是枚举第i组选几个
-
转移的时候用的是上一层的状态就从大到小枚举体积,用的是本层就要从小到大枚举体积
1 | |
线性DP
时间复杂度一般为状态数量*转移计算量
最大最小值可以有重复,数量不可以有重复
数字三角形

1 | |
上升子序列

1 | |
1 | |
最长公共子序列

1 | |
区间DP
石子合并

1 | |
计数类DP
- 技巧:当区间不好算的时候就转化为就前缀和


数位统计DP
求出1在每一位上出现的次数
1 | |
状态压缩DP
蒙德里安的梦想
1 | |
最短hamilton路径

1 | |
树形DP
没有上司的舞会


1 | |
记忆化搜索
滑雪问题

1 | |
算法·动态规划
http://example.com/2024/03/29/算法·动态规划/
