决策单调性优化 DP
决策单调性优化 DP
这里面学问很深啊。优化方式也多种多样。
总的来说,对于一类形如 的转移方程,设 为使 取到最小值的点,那么如果 单调递增,我们就可以使用决策单调性优化 DP。
定理
这里给出一个定理: 单调递增,当且仅当 满足四边形不等式,即
这个式子有更一般(但完全等价)的形式,即
更一般地,如果转移方程形如 ,那么将 式若将不等号反向后成立,那么该转移同样满足决策单调性。证明基本一样。
不难用归纳法从 推出 ,在 中令 即得 。
略证:四边形不等式即
从这个式子可以看出来,四边形不等式实际上体现了某种意义上的凸性质。
因此大多数和「次幂」(如平方,根号)有关的式子都可以猜一手决策单调性。毕竟幂函数总是凸的。
因此,考虑 的决策点 ,由 的最优性,对于任意的 ,均有
我们证明:当 变为 时仍有 。下面简记 为 。
由于 满足四边形不等式,因此
这里 分别为
即得 。这就完成了证明。
二分队列
现在我们知道 单调递增,第一个想法是在转移时从 到 枚举 尝试转移,但是这样复杂度也不对。
我们考虑直接维护 这个序列,一开始将 全部设置为 ,也就是先让所有 都从 转移。
我们的算法可以保证在计算到 时, 恰好就是 的最优决策点。
在计算到 时,首先由 直接计算出 的值,接下来我们将根据 的值来更新后面的决策点。
具体来说,由决策单调性我们可以知道,一旦某个地方满足 ,那么后面的 都至少是 。
而当前我们只考虑到 ,也就是决策集合只有 ,因此实际上只需要找到这个位置 满足
- 恰好是 的最优决策点,但是 的最优决策点在 之前
然后把 全都赋值为 即可。找到这样的 可以使用二分。根据决策单调性,这样的 应当满足 数组中目前存储的决策点中, 之前的决策都比 好, 之后的决策都比 差,二分出这个位置即可。
现在得到这个位置之后,我们需要对 后面的位置进行整体赋值。你说我会用线段树维护序列,当然可以,不过这样做复杂度似乎要 ,而用下面的方式可以做到 。
其实说出来也没什么,把序列划分成若干极长连续段,满足每个连续段中 的值都相同。接下来二分完成后只需要修改 个连续段,删除若干连续段,并插入一个连续段即可。这其实就是所谓「珂朵莉树」。
分治优化
这一种优化方式仅限 的情形,也就是给定 ,我们需要算出 的情形。
我们定义 表示需要计算出 的最优决策点,并且已经确定了每个决策点都在 之内。考虑找到区间中点 ,然后暴力计算 的最优决策点 。
由决策单调性我们知道 中的决策点都在 中, 的决策点都在 中,因此可以递归进 与 。
复杂度如何呢?画出分治树,分治树共 层,在每一层中,所有的 并起来恰好是 ,因此总的枚举次数不超过 。如果计算 的时间复杂度是 ,那么总的时间复杂度是 。
你或许已经发现,如果要算 的转移,这种方法需要在计算 时已知前面的所有 值。
而这是不可能的,因此这种方法只适用于 的转移,方法一则同时适用于 和 。
但方法一也有缺点,下面我们就会说明。
大多数情况下 ,不过也存在少数 不好计算的情况。
若贡献难以在常数时间内计算
对于这类贡献,虽然 难以 或 计算,但 如果满足
- 在已知 的情况下,我们可以快速算出 以及
那么同样可以使用分治法在 的时间复杂度内完成转移,其中 部分是通过 算 与 的复杂度。
解决方法很暴力:我们在全局维护两个指针 ,每次需要计算 时,直接暴力将 移动至需要查询的区间。这看起来非常暴力,但是我们可以证明:
- 按照正常的 DFS 序遍历分治树,指针的移动次数不会超过 。
我们把左右端点分开考虑。
对于右端点,由于它总是被设为 后不动,接下来递归进 与 ,因此指针总是从区间 的某个端点移动到中点处,次数不超过 ,总的移动次数自然不超过 。
对于左端点,它在移动完后总是等于 ,类似右端点可以证明左端点的移动次数是 的。因此,总的移动次数同样是 。
这就是分治法的优点所在,可以发现二分法是无法处理这样的贡献的。
有些文章把这种方法称为「整体二分」,我认为也有一定道理
对于 类,且贡献难以计算的转移方程,我暂时没有好的解决办法,有鸽鸽教教我吗/kel
当决策值单峰
这里单峰(单谷)指的是,设 的最优决策点为 ,则:
- 之前的决策值 随 增大单调递减, 之后的决策值单调增。
这样,我们就可以直接维护 的最优决策点 ,并在计算 时维护指针 从 开始往后跳,一旦发现 就说明找到了峰值,可以直接用 更新 。
由单峰的性质可以得到这样做的正确性。算法的时间复杂度是优秀的 。
不难发现这同样适用于贡献难算但可以快速移动端点的情形。
二分栈
咕
例题
POI2011 Lightning Conductor
很板的题,分 与 讨论,看到 很容易猜到凸性质,因此具有决策单调性。两种优化方式均可。
NOI2009 诗人小 G
同样是幂函数,容易猜到凸性质。不过这次只能用第一种优化方式了。
CF868F Yet Another Minimization Problem
分 层转移,贡献不好计算但可以快速移动区间端点,使用分治法,复杂度 。代码巨好写
Luogu5774 CmdOI2019 任务分配问题
区间逆序对看上去也很有次幂的味道,我们猜它满足四边形不等式。
略证:四边形不等式即
我们发现左边恰好是 中 的元素个数,右边恰好是 中 的元素个数
显然左边不会比右边小,这就完成了证明。类似上题,用树状数组维护区间转移即可做到 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?