带权二分总结

简介

带权二分,又叫 wqs 二分、DP 的凸优化,是一种对最优化问题的 DP 的优化。关于带权二分的题目通常会有一个 K K K 的限制,即需要求某些条件恰好为 K K K 时的最优解。如果关于 K K K 的最优解函数图像是凸的(上或下),我们就可以使用此算法。

通常来说,带权二分可以将 DP 中关于限制的维度以 O ( log ⁡ 2 V ) \Omicron(\log_2 V) O(log2V) 的时间全部压掉(其中 V V V K K K 在精度内的值域大小),能极大优化时间和空间。

算法

我们设最优解函数为 f f f,题目所求限制为 K ′ K' K

考虑由所有的 ( K , f ( K ) ) (K,f(K)) (K,f(K)) K K K 为精度内满足题意的所有可能的 K ′ K' K 值,通常为某区间内的连续整数,下同)组成的凸包(不妨设为上凸),我们可以通过求出与凸包切于 ( K ′ , f ( K ′ ) ) (K',f(K')) (K,f(K)) 点的直线斜率来算出 f ( K ′ ) f(K') f(K)。而根据凸包定义,斜率具有单调性,可以根据直线切在凸包上的位置来二分调整斜率。


那么每次如何算出当前斜率的直线切在凸包上的位置呢?

我们先换一种方法来表述直线与凸包的切点:将直线 “放” 在凸包上方与凸包不相交的位置,然后持续向下平移,第一个与凸包相交的点就是切点。

考虑上面这个平移的过程,其实就是直线在 y y y 轴上的截距不断减小,所以不难得出得出切点就是对应直线(当前斜率下过这个点的直线)截距最大的点。


于是我们考虑每次根据截最大距算出切点。

设当前枚举到的斜率为 w w w,点 ( K , f ( K ) ) (K,f(K)) (K,f(K)) 的截距为 f ′ ( K ) f'(K) f(K)

首先根据简单的初中知识,容易得到 f ′ ( K ) = f ( K ) − K w f'(K)=f(K)-Kw f(K)=f(K)Kw。又考虑到 f f f 本身的意义,可以直观的将 f ′ f' f 理解成在原问题下 K K K 每次加一都有 w w w 的代价(这也是带权二分思想的一种不太严谨的解释,即通过二分代价来调整限制),所以计算时对改变 K K K 的转移每次减去

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值