DP优化总结

单调队列优化DP

一般方程

[dp(i)=min_{L(i)leq j leq R(i)} {dp(j)+val(i,j)} ]

(val(i,j))是一个每一项只与(i)(j)中的一个值有关的多项式,这是使用单调队列优化的基本条件,我们可以在外层循环为定值的时候,将方程中与(i)和与(j)有关的拆开,与(i)有关的为定值,随着(i)的变化,(j)的上下界发生变化,维护(val(i,j))的单调性,及时排除无用的决策,使得DP得以优化
[SCOI2010]股票交易

斜率优化DP

一般方程在单调队列的基础上,(val(i,j))中的多项式与(i,j)都有关,有二次项
(dp(i)=max{dp(j)+a(su(i)-su(j))^2+b(su(i)-su(j))+c})
(dp(i)=min{dp(j)+(su(i)+i-su(j)-j-L-1)^2})
先看第一个式子

[dp(i)=dp(j)+asu^2(i)+asu^2(j)-2asu(i)su(j)+bsu(i)-bsu(j)+c ]

[dp(j)-asu^2(j)+bsu(j)=-2asu(i)su(j)+asu^2(i)+bsu(i)-dp(i)+c ]

(-2asu(i))看作斜率,(su(j))为自变量,(dp(j)-asu^2(j)+bsu(j))为因变量,那么每一个决策可以看作是(-2asu(i)x+asu^2(i)+bsu(i)-dp(i)+c)这条直线上的一个点,由于斜率是固定的,且此例中点形成了一个上凸壳,用单调队列维护,最优决策是两个决策点之间斜率(slope)第一次小于(-2asu(i))时的前一个决策点。
另一例是同样的道理,最后需要维护的是一个下凸壳。
[APIO2010]特别行动队
[HNOI2008]玩具装箱
[ZJOI2007]仓库建设
[APIO2014]序列分割

四边形不等式优化DP

(w(i,j))是定义在整数集合上的二元函数,对于定义域上的任意整数(a,b,c,d(aleq bleq cleq d))都有(w(a,d)+w(b,c)geq w(a,c)+w(b,d))(w(i,j))满足四边形不等式
四边形不等式的另一个形式((a< b))

[w(a,b+1)+w(a+1,b)geq w(a,b)+w(a+1,b+1) ]

一般方程

[dp(i)=min_{0 leq j < i}{dp(j)+w(j,i)} ]

定理:若函数(w(j,i))满足四边形不等式,则dp有决策单调性。
由此,我们可以将dp计算优化到(O(nlogn))
实现
我们维护一个队列,维护整个决策数列,队列里的元素是一个三元组((j,l,r)),表示(i in [l,r])时决策点为(j),那么每次新算出来一个(dp(i))考虑其可以成为那些(dp(i'))的决策点,由于决策单调性,在队列里二分到一个位置,在此位置之后所有决策都没有当前的(i)优,并将(i)加入决策队列。
同时我们发现算完了(i)之后决策队列中([1,i-1])的决策就没用了,及时排除队首无用的决策,所以我们其实维护了以个单调队列。
[NOI2009]诗人小G
[POI2011]Lightning Conductor

二维四边形不等式优化区间DP

一般方程

[dp(i,j)=min_{i leq k < j}{dp(i,k)+dp(k+1,j)+w(i,j)} ]

定理1
如果此方程满足
1.(dp(i,i)=w(i,i)=0)
2.(w(i,j))满足四边形不等式
3.对于任意的(ale b le c le d)(w(a,d) ge w(b,c))
那么(dp(i,j))也满足四边形不等式
定理2
(p(i,j))(dp(i,j))取到最小值的(k)值,如果(dp(i,j))具有四边形不等式,那么对于任意的(i<j),有(p(i,j-1)le p(i,j) le p(i+1,j))
实现
由此,我们可以将(k)的枚举框定在([p(i,r-1),p(l+1,r)])中就可以了,可以证明复杂度为(O(n^2))
[NOI1995]石子合并
[IOI2000]邮局

原文地址:https://www.cnblogs.com/hangzz/p/13869438.html