斜率优化的三种形式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangjingyuan107/article/details/82503738

由于本人弱

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

三种形式

形式一

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

从《1D1D动态规划优化初步》里可知
w ( i , j ) 满足四边形不等式 f [ i ] 满足决策单调性,即 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 ) 满足四边形不等式,那么对于每个i,循环完j之后,s[i]是这样的:
111111222222333333
而不会出现如下的情况:
111111333333222222
也就是 i j , s [ i ] s [ j ]
这启发了我们要维护这些段。具体地,每段维护两个值:决策、位置。
维护一个栈。每次加入新决策j,比较栈顶的位置是用原先的决策,还是用新决策更优。如果是新决策更优,显然要踢掉整一段。否则进入二分环节。

形式二

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

这里使用我们很熟悉的单调队列优化。
j k , g ( k ) g ( j ) ,则决策j将会被踢掉。
所以,如果将该踢掉的决策踢掉,剩余的决策按照k排序,则 g ( k ) 必然单调。
启发:使用单调队列维护。
时间复杂度: O ( n )

形式三

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

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

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

猜你喜欢

转载自blog.csdn.net/huangjingyuan107/article/details/82503738