由于本人弱
这些知识刚刚学的。只是拾人牙慧罢了。
大纲
对于我这个蒟蒻来说,决策单调性挺难啃。
就讲2个点。
①四边形不等式证明决策单调性。(形式一)(网络上有很多参考资料可供阅)
②没被踢除的决策具有单调性。(形式二、三)
形式一和形式二三还是有很大的区别的。
三种形式
形式一
从《1D1D动态规划优化初步》里可知
w(i,j) w ( i , j ) 满足四边形不等式 ⇔ ⇔ f[i] f [ i ] 满足决策单调性,即 ∀i≤j,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
也就是
∀i≤j,s[i]≤s[j]
∀
i
≤
j
,
s
[
i
]
≤
s
[
j
]
四边形不等式证明了决策单调性。
这启发了我们要维护这些段。具体地,每段维护两个值:决策、位置。
维护一个栈。每次加入新决策j,比较栈顶的位置是用原先的决策,还是用新决策更优。如果是新决策更优,显然要踢掉整一段。否则进入二分环节。
形式二
这里使用我们很熟悉的单调队列优化。
若 ∃j≤k,g(k)≤g(j) ∃ j ≤ k , g ( k ) ≤ g ( j ) ,则决策j将会被踢掉。
所以,如果将该踢掉的决策踢掉,剩余的决策按照k排序,则 g(k) g ( k ) 必然单调。
没被踢除的决策具有单调性。
启发:使用单调队列维护。
时间复杂度: O(n) O ( n )
形式三
条件: 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来维护凸包。
具体的,我太弱了,不会。