【学习笔记】DP 优化 5:wqs 二分优化 DP
概述#
wqs 二分是一种优化带有数量限制的最优化问题的方式(即题目限制最多/最少/恰好选择 个物品时的最大/小值),要求关于数量的函数具有凸性。以最小值为例,要求函数是下凸的。
算法思想#
由于状态数至少 ,在朴素 DP 的基础上进行优化,时间复杂度也不会低于 ,因此要想办法解除 的限制。
设函数 表示选择 个物品的最小值,考虑增加一个附加权值 ,每选择一个物品需要增加 的代价,令 ,那么 也是下凸的,求出此时 的最小值对应位置 ,这实际上等价于用斜率为 的直线去切 构成的凸包,对应的截距就是 。
不难发现,由于凸函数的斜率具有单调性,可以二分 来找到使 恰好为最小值的情况,这样就能将数量放入转移方程中,从而忽略严格的数量限制。
实现细节#
存在一个可能的问题: 可能出现多点共线的情况,即 可能永远无法被切到。
若 左右的斜率都为 ,那么二分过程中,一定存在斜率为 的时刻,此时整个线段的截距都相等,自然可以计算。
同时在二分过程中,如果当前的 满足条件,那么直接更新答案为 ,注意不是 ,也不是取 。
二分之后,内层的处理一般是使用较为朴素的 DP 优化手段,例如斜率优化、决策单调性分治以及二分队列。
内层处理的 DP 可能存在值相同的情况,此时可以选择数量尽量多的方案,这样如果此时的 ,则可能是合法答案,可以更新,否则不是。
函数凸性的证明#
在大多数题目中, 的凸性都是通过感性理解和打表来验证的,但也存在一部分题目具有良好的性质。
对于将 划分为有数量限制的若干段求最值的区间划分问题,转移方程形如:
若 满足四边形不等式,则 是凸函数。
证明从凸函数差分数组单调性入手,即证明 。
考虑 对应的区间划分 以及 对应的区间划分 ,找到最小的 使得 ,同时满足 ,即 ,此时将 之后的区间交换,这两个区间交换右端点,即 以及 。
这样两个划分大小都是 。设交换后两个方案的权值和 ,由于 是最优方案,有 ,同时根据四边形不等式,交换后的 ,那么 ,凸性得证。
满足四边形不等式的基础上,还可以使用二分队列来优化,一举两得。
例题#
Luogu-P2619 国家集训队 Tree I#
不是 DP 题目,但是是比较经典的 wqs 二分。
记 为选择 条白色边的最小生成树,数量尽量多对应排序时白边优先。
Luogu-P4983 忘情#
整理一下发现就是 ,满足四边形不等式所以是凸的,可以 wqs 二分。
内层用斜率优化或者二分队列均可。
AtCoder-JOISP2023_G ビーバーの合唱#
首先通过调整,使得第 个 在第 个 之前,容易发现对于所有方案,这样的调整都是要进行的。
之后大致考虑一个 DP, 表示当前把前 个 和 划分成 段的最小操作次数。
转移需要考虑贡献函数 表示将第 的 和 调整成所有 都在 前的最小操作次数。由于现在保证第 个 一定在第 前,那么将第 个 到第 个 的部分拿出来,发现可以分成五部分:一些排名在 内的 、一些排名 的 、一些 和 、一些排名 的 以及一些排名在 内的 。发现实际上操作只在第三部分进行,那么每个 需要被操作的次数等于前面 的个数。
设 表示第 个 前面 的个数,那么得到贡献函数 ,容易证明 满足四边形不等式,可以 wqs 二分优化。
考虑如何优化内层 DP,首先是去掉取 ,设 表示第一个 的 ,得到 。记 的前缀和 ,就化简成了 ,可以斜率优化。
同样存在 的情况不能拆成前缀和,这时贡献函数为 ,而由于 单调,在斜率优化时可以等到 的 出现再把 加入凸包,同时还要维护没有加入的 中 的最小值,可以单调队列。这样内层 DP 就做到线性。
参考资料#
-
OI Wiki
作者:SoyTony
出处:https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_DP_Optmization_5.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效