斜率优化的三种形式

由于本人弱

这些知识刚刚学的。只是拾人牙慧罢了。

大纲

对于我这个蒟蒻来说,决策单调性挺难啃。
就讲2个点。
①四边形不等式证明决策单调性。(形式一)(网络上有很多参考资料可供阅)
②没被踢除的决策具有单调性。(形式二、三)
形式一和形式二三还是有很大的区别的。

三种形式

形式一

f[i]=min{f[j]+w(j,i)} f [ i ] = m i n { f [ j ] + w ( j , i ) }

从《1D1D动态规划优化初步》里可知
w(i,j) w ( i , j ) 满足四边形不等式 f[i] f [ i ] 满足决策单调性,即 ij,s[i]s[j] ∀ i ≤ j , s [ i ] ≤ s [ j ]
如何理解?
现在我们正在做这件事。

for i=0 to n
    for j=i+1 to n
        if(f[i]>f[j]+w(j,i))f[i]=f[j]+w(j,i),s[j]=i;

如果证明了 w(i,j) w ( i , j ) 满足四边形不等式,那么对于每个i,循环完j之后,s[i]是这样的:
111111222222333333
而不会出现如下的情况:
111111333333222222
也就是 ij,s[i]s[j] ∀ i ≤ j , s [ i ] ≤ s [ j ]

四边形不等式证明了决策单调性。

这启发了我们要维护这些段。具体地,每段维护两个值:决策、位置。
维护一个栈。每次加入新决策j,比较栈顶的位置是用原先的决策,还是用新决策更优。如果是新决策更优,显然要踢掉整一段。否则进入二分环节。

形式二

f[i]=mini1j=b[i]{g[j]}+w[i] f [ i ] = m i n j = b [ i ] i − 1 { g [ j ] } + w [ i ]

这里使用我们很熟悉的单调队列优化。
jk,g(k)g(j) ∃ j ≤ k , g ( k ) ≤ g ( j ) ,则决策j将会被踢掉。
所以,如果将该踢掉的决策踢掉,剩余的决策按照k排序,则 g(k) g ( k ) 必然单调。

没被踢除的决策具有单调性。

启发:使用单调队列维护。
时间复杂度: O(n) O ( n )

形式三

f[i]=mini1j=1{a[i]f[j]+b[i]g[j]} f [ i ] = m i n j = 1 i − 1 { a [ i ] ∗ f [ j ] + b [ i ] ∗ g [ j ] }

条件: a[i],b[i] a [ i ] , b [ i ] 可快速求出。
跟大家说的斜率优化有何联系?
将式子看成 d=ax+by d = a x + b y ,整理,得 y=abx+db y = − a b x + d b
则求纵截距的极值。
将点 (f[i],g[i]) ( f [ i ] , g [ i ] ) 标在平面直角坐标系中,则直线碰到的第一个点就是最优决策。
如果决策直线的斜率与二元组的横坐标同时满足单调性,那很好。
可以得到决策点必然在凸壳上。并且单调地移动。

优化原理:踢掉一些不优的决策 j<k,g(j) ∃ j < k , g ( j ) 没有 g(k) g ( k ) 优,那么将j踢掉。
决策直线的斜率与二元组的横坐标同时满足单调性 决策单调性。


没被踢除的决策具有单调性。

时间复杂度: O(n) O ( n )

当然,有些题目比较毒瘤,如果决策直线的斜率与二元组的横坐标不一定同时满足单调性。
需要用到splay来维护凸包。
具体的,我太弱了,不会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值