Loading

DP 优化 - wqs 二分

WQS 二分又称带权二分和 dp 凸优化。

前排传送门:

https://www.cnblogs.com/alex-wei/p/DP_Involution.html

https://blog.csdn.net/a_forever_dream/article/details/105581221

适用性

该算法的使用特征显著:一般出现在强制某个值恰好 \(=x\) 或者 \(\leq m\)\(\geq m\)
具体地,可以是物体选取时必须选取 \(m\) 个;可以是二维 dp 某一维必须是 \(m\)

wqs 二分应用在 1D dp / 2D dp 上。wqs 二分可以将二维 dp 的某一维扔掉(被限制的维度)。

同时,能应用 wqs 二分的东西 \(f(i)\)(1D / 1D dp,后者是二维扔了一维度之后的) 必须满足凸性。但是凸性不好证,于是使用打表和盲猜法:\(O(nk)\) 不能做的可以大胆猜想是凸。

思想

首先该函数 \(f(i)\) 满足凸性,尝试去刻画这个凸包,刻画成功后就能求出 \(f(i)\) 即 dp 值。

由于某个值被限制,考虑拿着一个直线去截这个凸包,因为是凸包,类比斜率优化的想法,这个交点一定是某种“最优”。然后对于这个直线,可以用类似斜率优化的方法求出它的 \(k\)(斜率,其实是传进去的)、\(x\)(交点,横坐标)、\(b\)(截距)。此时就能算出 \(x\) 点的纵坐标 \(f(i) = kx + b\)

因为要求点 \((m, f(m))\),所以我们要通过调整斜率 \(k\) 的方法,让直线切凸包于 \((m,f(m))\),从而得到 \(f(m)\)

然后因为这是个凸包,所以 \(k\)\(x\) 是有关联的。

以下内容基于前提,钦定凸包是下凸包,上凸包简单类比即可。

此时如果交点 \(x \lt m\),则 \(k\) 过小,要增大 \(k\)

如果交点 \(x = m\),恭喜找到答案;

如果交点 \(x \gt m\)\(k\) 过大,减小 \(k\)

所以这个外层可以二分解决。

内部的问题是在调整斜率后求最值切点,原来的 \((x,f(x))\) 变成 \((x,f(x)-xk)\),然后类斜率优化去求就行了。

要注意的是,内部 \(f(i)\)\(i\) 不一定是枚举的东西,而是一个被限制的那一维。

posted @ 2025-08-01 23:58  lajishift  阅读(11)  评论(0)    收藏  举报