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(a\leq b\leq c\leq 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.对于任意的\(a\le 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]邮局

posted @ 2020-10-24 14:42  行zzz  阅读(120)  评论(0编辑  收藏  举报