决策单调性优化 DP

2D/1D DP 的决策单调性优化

2D/1D DP 指状态有两维、转移有一维的 DP。

定理:对于形如 f(i,j)=mink=ij1{f(i,k)+f(k+1,j)}+w(i,j)f(i,j)=\min\limits_{k=i}^{j-1}\{f(i,k)+f(k+1,j)\}+w(i,j) 的 DP 式,若:

  • 区间包含单调性:对于 ii<jji\le i'<j\le j',满足 w(i,j)w(i,j)w(i',j)\le w(i,j')。((互相包含的两个区间)大区间大于小区间)

  • 四边形不等式:对于 ii<jji\le i'<j\le j',满足 w(i,j)+w(i,j)w(i,j)+w(i,j)w(i,j)+w(i',j')\le w(i',j)+w(i,j')。(包含大于交叉)

均满足,记 f(i,j)f(i,j) 的决策点 k=s(i,j)k=s(i,j),则 s(i,j1)s(i,j)s(i+1,j)s(i,j-1)\le s(i,j)\le s(i+1,j)。(或写成 s(i1,j)s(i,j)s(i,j+1)s(i-1,j)\le s(i,j)\le s(i,j+1))(左边加一个点,决策点不动或左移)

可以证明,这样枚举决策,总时间复杂度为 O(n2)O(n^2)

四边形不等式的判定

  1. 若对于 i,j\forall i,j,均有 w(i,j)+w(i+1,j+1)w(i,j+1)+w(i+1,j)w(i,j)+w(i+1,j+1)\le w(i,j+1)+w(i+1,j) 成立,则 w(i,j)w(i,j) 满足四边形不等式。
  2. w1(i,j)w_1(i,j)w2(i,j)w_2(i,j) 都满足四边形不等式(或区间包含单调性),则对于 c1,c20\forall c_1,c_2\ge0c1w1+c2w2c_1w_1+c_2w_2 也满足四边形不等式(或区间包含单调性)。
  3. 若存在前缀和 f(i),g(i)f(i),g(i) 使得 w(i,j)=f(j)g(i)w(i,j)=f(j)-g(i),则 w(i,j)w(i,j) 满足四边形不等式。若 f(i),g(i)f(i),g(i) 单增,则 w(i,j)w(i,j) 还满足区间包含单调性。
  4. h(x)h(x) 是递增的下凸函数,且 w(i,j)w(i,j) 满足区间包含单调性和四边形不等式,则 h(w(i,j))h(w(i,j)) 也满足区间包含单调性和四边形不等式。
  5. 若『4.』中的 h(x)h(x) 是不递增的下凸函数,则只能得出 h(w(i,j))h(w(i,j)) 满足四边形不等式。

1D/1D DP 的决策单调性优化

定理:对于形如 f(i)=minj=1i1{f(j)+w(j+1,i)}f(i)=\min\limits_{j=1}^{i-1}\{f(j)+w(j+1,i)\} 的 DP 式,若 w(i,j)w(i,j) 满足区间包含单调性和四边形不等式,则 s(i)s(i) 满足单调性。

方法一. 分治

分治可以做有层次的 DP 形如 f(d,i)=minj=1i1{f(d1,j)+w(j+1,i)}f(d,i)=\min\limits_{j=1}^{i-1}\{f(d-1,j)+w(j+1,i)\}

对于区间 [l,r][l,r],假设已经找到决策区间 [s(l),s(r)][s(l),s(r)],就可以暴力找出 s(mid)s(\text{mid}),向左右递归 [l,mid1][l,\text{mid}-1][mid+1,r][\text{mid}+1,r]

方法二. 二分 + 单调队列

维护每个决策点 jj 可以对哪些 ii 造成贡献,显然这些 ii 连成一个区间 [lj,rj][l_j,r_j]。维护每个 jjljl_j,有 rj=lj+11r_j=l_{j+1}-1。于是使 ljl_j 单增,查询时需要找到最大的 <i<iljl_j

现在考虑加入新决策点 jj,将它和当前决策队列的队尾 last\text{last} 比较。二分找到最小的 kk 满足 f(last)<f(j)f(\text{last})<f(j) (?),若 kk[llast,j][l_{\text{last}},j] 区间上,则现在 last\text{last} 的贡献区间为 [llast,k1][l_{\text{last}},k-1],而 jj 的贡献区间为 [k,j][k,j];若 k<llastk<l_{\text{last}},那么 last\text{last} 可被删除,再将 jj 与新的队尾比较。

这样总时间复杂度为 O(nlogn)O(n\log n)


动态 DP(DDP)

树剖套线段树维护矩乘

题意:给你一棵 nn 个点、带点权的树。mm 次操作,每次操作将点 xx 的点权修改为 yy。求每次操作后的最大权独立集的权值大小。

n,m105n,m\le10^5

暴力地 DP 形如 f(u,c)=vson(u)max{f(v,0)+cwu,f(v,1)+c}f(u,c)=\sum_{v\in\text{son}(u)}\max\{f(v,0)+c\cdot w_u,f(v,1)+c\cdot-\infty\}c{0,1}c\in\{0,1\})。

把重儿子拎出来,剩下所有轻儿子记为 g(u,c)g(u,c)。转移如:

{f(u,0)=max{f(v,0)+g(u,0),f(v,1)+g(u,0)}f(u,1)=max{f(v,0)+g(u,1),f(v,1)}\begin{cases}f(u,0)=\max\{f(v,0)+g(u,0),f(v,1)+g(u,0)\}\\f(u,1)=\max\{f(v,0)+g(u,1),f(v,1)-\infty\}\end{cases}

写出矩阵转移如:

[g(u,0)g(u,0)g(u,1)][f(v,0)f(v,1)]=[f(u,0)f(u,1)]\begin{bmatrix}g(u,0)&g(u,0)\\g(u,1)&-\infty\end{bmatrix}\cdot\begin{bmatrix}f(v,0)\\f(v,1)\end{bmatrix}=\begin{bmatrix}f(u,0)\\f(u,1)\end{bmatrix}

修改一个点 xx 时,会对 g(x,1)g(x,1)xx 到根路径上的所有轻边造成影响。

时间复杂度 O(nlogn)O(n\log n)