动态规划需要大量的练习,运用所学习的技巧与优化,本篇为练习。
I CF53E Dead Ends
很小,考虑状压, 状态是一定要有的,每加一条边我们叶子节点会变化,这启示我们记录叶子结点的集合 ,设 表示 状态下,该树叶子结点状态为 的方案数,则对于一条边 ,有
对于每个状态可能会有多算的,需要除上 ,初始化两个节点的情况,复杂度 。
代码
II P5369 [PKUSC2018] 最大前缀和
我们有数列 ,对于 其是最大前缀和,则需要满足的条件:
- 对于 ,需满足 ,即 之前的数列的后缀和不小于 ,总和除外。
- 对于 ,需要满足 ,即 之后的数列的前缀和小于 。
较小,考虑状压,设 表示所有前缀和 的方案数, 表示所有后缀和 的方案数,有:
其中 表示 状态中所有节点权值和。
由于前缀总和的和不需要 ,所以我们在 DP 中直接计算答案,有:, 表示全集,即 。
复杂度 。
代码
III AT_arc107_d Number of Multisets
设 表示 个元素,和为 的方案数。
若为 ,,否则可能成为分数,考虑由其他状态转移。
若为 ,则可以由 转移,也就是将该状态的数都除 ,这样再加上 即为 。
其余同理,类似前缀和的我们可以倒序枚举,有 。
复杂度 。
代码
IV P3643 [APIO2016] 划艇
好题。
首先可以离散化,对于 ,表示选择区间 中的划艇个数,利用左闭右开区间可以更好处理。
设 表示前 个学校,当前学校选择 中的数的方案数,因为有可能前 个点也在该区间,所以我们先求若还有 个点选择 区间,插板法易得方案数为 ,所以我们可以枚举不在区间 的点。
若区间 包含 区间,。
对于组合数有 ,展开易证,我们倒序枚举 ,可以 处理组合数。
对于 ,其与后面的组合数没有关系,可以前缀和处理。
复杂度 ,记得预处理逆元,不要像我这个傻逼多写的 log 都不知道。
代码
V Random IS
直接 DP,有问题,具体是因为对于相同的选择,不同的顺序是会影响其概率的。
我们考虑区间 DP,设 ,表示钦定选定 在区间 内选择的期望。
这里有一个奇怪的地方,为何我们不考虑区间外的点呢,可以知道因为钦定了 所以选择区间外的点是不影响区间内的可选点集的,即其影响到只是其时间先后,而不是顺序,即这些选择的顺序是不影响概率的,我们可以枚举中间节点进行转移。
所以有转移 ,直接转移是 。
用数据结构维护下,可以达到 ,可以用 值域BIT。
代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现