斜率优化的三种形式

由于本人弱

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

大纲

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

三种形式

形式一

f[i]=min{f[j]+w(j,i)}f[i]=min{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]=minj=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]=minj=1i−1{a[i]∗f[j]+b[i]∗g[j]}

条件:a[i],b[i]a[i],b[i]可快速求出。
跟大家说的斜率优化有何联系?
将式子看成d=ax+byd=ax+by,整理,得y=abx+dby=−abx+db
则求纵截距的极值。
将点(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、付费专栏及课程。

余额充值