版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangjingyuan107/article/details/82503738
由于本人弱
这些知识刚刚学的。只是拾人牙慧罢了。
三种形式
形式一
从《1D1D动态规划优化初步》里可知
满足四边形不等式 满足决策单调性,即
如何理解?
现在我们正在做这件事。
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;
如果证明了
满足四边形不等式,那么对于每个i,循环完j之后,s[i]是这样的:
111111222222333333
而不会出现如下的情况:
111111333333222222
也就是
这启发了我们要维护这些段。具体地,每段维护两个值:决策、位置。
维护一个栈。每次加入新决策j,比较栈顶的位置是用原先的决策,还是用新决策更优。如果是新决策更优,显然要踢掉整一段。否则进入二分环节。
形式二
这里使用我们很熟悉的单调队列优化。
若 ,则决策j将会被踢掉。
所以,如果将该踢掉的决策踢掉,剩余的决策按照k排序,则 必然单调。
启发:使用单调队列维护。
时间复杂度:
形式三
条件: 可快速求出。
跟大家说的斜率优化有何联系?
将式子看成 ,整理,得
则求纵截距的极值。
将点 标在平面直角坐标系中,则直线碰到的第一个点就是最优决策。
如果决策直线的斜率与二元组的横坐标同时满足单调性,那很好。
可以得到决策点必然在凸壳上。并且单调地移动。
时间复杂度:
当然,有些题目比较毒瘤,如果决策直线的斜率与二元组的横坐标不一定同时满足单调性。
需要用到splay来维护凸包。
具体的,我太弱了,不会。