斜率优化学习

斜率优化

从入门到提高到放弃

今天本来说复习计算几何的凸包(顺便学一下动态凸包),结果教练给我们的凸包题目全是用凸包来优化DP的,汗-_-||,开始还行吧,结果越到后面越懵逼……


  • 斜率怎么用来做优化?

    因为许多的DP都是一个方程,而DP一般都是求解最优值,也就是最大或最小等等,大多形如:

    dp[i]=max/min{j<ij=1{dp[j]+calc(i,j)} d p [ i ] = m a x / m i n { j = 1 j < i { d p [ j ] + c a l c ( i , j ) }

    最初都是 O(n2) O ( n 2 ) 的复杂度,但是我们可以令两个值 j,k j , k ,并假设从 j j 转移到i比从 k k 转移到i更优秀,于是便可以得到一个不等式, dp[j]+calc(i,j)<dp[k]+calc(i,k) d p [ j ] + c a l c ( i , j ) < d p [ k ] + c a l c ( i , k ) (这里假设求最小值),然后移项整理合并就可以得出一个类似于如下式子的关系:

    (dp[j]dp[k]+calc(i,j)calc(i,k)<0 ( d p [ j ] − d p [ k ] + c a l c ( i , j ) − c a l c ( i , k ) < 0

    然后我们选择一个跟 i i 有关的项作为斜率,式子就变成了:

    dp[j]dp[k]+(etc)<i(etc)

    上面这是第一种(应该好理解吧),下面一种就是从坐标系来分析。
    我们写出DP转移方程并化为类似的直线方程,如 y=kx+b y = k x + b ,那么我们一般将要求的答案放到 b b ,然后就转换成求该直线(也就是截距式)的纵截距的最值(纵截距也就是b的值)。然后就还是凸包搞了。

    然后又分为了大体三种情况:

    1. 第一种:就是斜率是随着 x,y x , y 的单调变化而单调的,这种最简单,根据具体情况一个优先队列维护一个凸壳就可以解决啦。
    2. 第二种:就是我们令式子其中的两个与 j j k有关的式子为 x,y x , y ,在斜率中有一个是单调的,那么另一个就可以二分查找,还是一个类似与单调队列的东西,只不过每次取队首变成了在之前的部分二分查找最优解。
    3. 第三种:也是想让人放弃的一种 x,y x , y 都不单调,没啥规律,那么只有动态维护凸壳(有时会是两个凸壳),朴素的在线做法为treap或者splay(或者直接用STL的map或set)维护凸包,然后查询最优解。如果不强制要求在线,那么神奇的CDQ分治就可以派上用场啦,用归并的思想,因为有时一般求 dp[i] d p [ i ] 时只会用 i1 i − 1 之前的,那么分治归并,先按照第一关键量的要求排序,然后递归处理第二关键量,(这里的第一第二关键量一般就是x,y了),递归l,r区间的时候先处理(l,mid)的情况,然后将影响转移到(mid+1,r),然后再处理(mid+1,r),一般 O(nlog2n) O ( n l o g 2 n ) 的时间就能解决了。(个人认为数据结构难写但好理解,而CDQ代码量少多了,但不太好理解)。

题目表(由简单到上天入地)

Good 文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VictoryCzt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值