DP 总结
DP,即动态规划(Dynamic Programming),是数学中比较冷门的学科,但在信息学中的用处很大。主要有(基础):
- 背包问题
- 区间 DP
- 状态压缩 DP
- 树形 DP
更深入的有:
- 插头 DP
- 概率 DP
DP 特征:无后效性,最优子结构,子问题重叠。
-
无后效性:也就是当前决策完后,后面的决策不再受当前的决策的影响。
-
最优子结构:最优解的子问题也是最优的
-
子问题重叠:一个决策不会是独立的,可能在后面的决策中用到。
1|0背包问题:
1|10-1 背包
- 题意:
给出物品的重量
- 思路:
设方程
则
点击查看代码
1|2完全背包
- 题意:
给出物品的重量
- 思路:
考虑
怎么优化呢?
发现对于
然后可以滚动数组优化掉第一维:
点击查看代码
1|3多重背包
其实就朴素的多重背包。
转移方程:
1|4混合背包
就是上面三种背包的结合。判断一下做出相应匹配背包即可。
1|5分组背包
- 题意:
有
- 思路:
就是对于每组求一次 0-1 背包即可。
点击查看代码
2|0区间 DP
顾名思义,就是在区间上进行 DP。
DP 顺序为从区间长度小的转移到大的上来。所以我们可以枚举长度
- 题意:
有一个环,每次可以选择相邻两个合并,如果前一颗能量珠的头标记为
- 思路:
首先破环为链。
显然
就是由区间
点击查看代码
3|0状压 DP
也就是状态压缩 DP,具体的,我们把
显然我们先要预处理出每一个点间的距离,这个可以用
我们设
然后我们暴力枚举所有的二进制形式
答案:
点击查看代码
4|0树形 DP
4|1普通的树形 DP
顾名思义,就是在树上进行 DP,一般和 dfs 一起出现。
这类问题我们优先考虑以当前节点
设
最后答案就是
点击查看代码
4|2换根 DP
换根 DP 也叫二次扫描法,是特殊的一种树形 DP。
分为几个步骤:
-
从节点
开始 dfs 得到以 为根整个树的答案 -
换根,试将根换成与
有边相连的点统计最优答案。
例题:luogu P3478 [POI2008] STA-Station
显然我们可以枚举每个
结论:
为什么呢?当以
点击查看代码
5|0数位 DP
形如问
然后我们采用记忆化来写数位 DP。
-
表示当前 dfs 到第 位,注意从高位枚举到低位。 -
表示第 位的答案。 -
表示上一位是否是满足条件的最大值,具体的,如果范围是 ,第 位如果是 ,那么第 位就只能取 了,否则第二位就可以取 了。
点击查看代码
6|0好题:
设
然后我们分三种情况讨论:
当前物品为
-
给
做, 的时间不变,为 。 -
给
做,那么 的时间不变, 。 -
给
同时做,那么时间都要变, 。
初始化:
答案:
但是题目的空间限制为
观察到
点击查看代码
设
考虑怎么转移:
-
为 或 时, 。 -
可以包括其他合法的序列,但是要满足括号要匹配, 。 -
根据
的定义,可以分成 加上一个 ,根据乘法原理,也就是 -
左起括号,右边随便,只有
符合( 包含 ),所以状态转移方程为 ,乘上 是因为 的定义是括号结尾,所以要加上一个括号。 的话就是加上 的情况。 -
发现
的定义其实是 的定义的逆序列,所以方程式的位置调换一下即可,也就是 。
答案:
初始化:
注:代码中
点击查看代码
luogu P6280 [USACO20OPEN] Exercise G
明显
我们设
点击查看代码
难度:*2000
设
如果
因为你可以从
如果
点击查看代码
参考:oi-wiki dp 专题,题解 P1433 【吃奶酪】,题解 P7914 【[CSP-S 2021] 括号序列】。
__EOF__

本文链接:https://www.cnblogs.com/ydq1101/p/17643141.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库