这篇文章主要介绍各种类型的决策单调性优化dp
考虑如下形式的dp
dpi=min{dpj+w(j+1,i)}j<i dp_i=min\{dp_j+w(j+1,i)\}_{j < i} dpi=min{dpj+w(j+1,i)}j<i
也可以是 maxmaxmax ,这里只讨论 minminmin 的情况
对于最一般的情况,可以直接 O(?)O(?)O(?) 计算 w(i,j)w(i,j)w(i,j) 或从 w(i,j)w(i,j)w(i,j) 转移到 w(i,j+1)w(i,j+1)w(i,j+1) ,可以 O(?n2)O(?n^2)O(?n2) 进行转移
如果要更优的时间复杂度,可以进行以下优化
决策单调性优化dp,一般需要满足的形式,对于两个位置 i1,i2i_1,i_2i1,i2 有两个决策点 x1,x2x_1,x_2x1,x2,如果 i1<i2i_1<i_2i1<i2 则 x1≤x2x_1 \le x_2x1≤x2
如何证明?
{dpx1+w(x1+1,i1)≤dpx2+w(x2+1,i1)dpx2+w(x2+1,i2)≤dpx1+w(x1+1,i2) \begin{cases} dp_{x_1}+w(x_1+1,i_1) \le dp_{x_2}+w(x_2+1,i_1)\\ dp_{x_2}+w(x_2+1,i_2) \le dp_{x_1}+w(x_1+1,i_2) \end{cases} {dpx1+w(x1+1,i1)≤dpx2+w(x2+1,i1)dpx2+w(x2+1,i2)≤dpx1+w(x1+1,i2)
w(x1+1,i1)−w(x1+1,i2)≤w(x2+1,i1)−w(x2+1,i2) w(x_1+1,i_1)-w(x_1+1,i_2) \le w(x_2+1,i_1)-w(x_2+1,i_2) w(x1+1,i1)−w(x1+1,i2)≤w(x2+1,i1)−w(x2+1,i2)
w(x1+1,i1)+w(x2+1,i2)≤w(x2+1,i1)+w(x1+1,i2) w(x_1+1,i_1)+w(x_2+1,i_2) \le w(x_2+1,i_1)+w(x_1+1,i_2) w(x1+1,i1)+w(x2+1,i2)≤w(x2+1,i1)+w(x1+1,i2)
只需证明上述不等式即可
回到决策单调性优化,最简单的一种情况,当 xxx 为 iii 的最优决策点时 dpy+w(y+1,i)≥dpx+w(x+1,i)dp_y+w(y+1,i) \ge dp_x+w(x+1,i)dpy+w(y+1,i)≥dpx+w(x+1,i) ,这时候只需要用一个指针维护最优决策点 xxx,一但发现决策点 x+1x+1x+1 不会更劣就右移指针
大多数情况没有这么简单,一般要用一个单调栈/队列维护所有有效的决策点,对于一个决策点 xxx ,令 fx(i)=dpx+w(x+1,i)f_x(i)=dp_x+w(x+1,i)fx(i)=dpx+w(x+1,i) ,转移时就是找到最小的 fx(i)f_x(i)fx(i) ,依次枚举考虑 iii 的过程中 iii 是单调递增的,如果 ∀j≥ifx(j)≤fy(j)\forall_{j \ge i} f_x(j) \le f_y(j)∀j≥ifx(j)≤fy(j) , yyy 这个决策点就没有任何存在的价值了,可以被移除单调栈/队列
分两种情况讨论
第一种情况,对于两个决策点 x≤yx \le yx≤y , 存在一个中心点 midx,ymid_{x,y}midx,y 满足
{∀j≤midx,yfx(j)<fy(j)∀j>midx,yfx(j)≥fy(j) \begin{cases} \forall_{j \le mid_{x,y}}f_x(j) < f_y(j)\\ \forall_{j > mid_{x,y}}f_x(j) \ge f_y(j) \end{cases} {∀j≤midx,yfx(j)<fy(j)∀j>midx,yfx(j)≥fy(j)
也就是说决策点 xxx 在 midmidmid 及之前是更优的,之后就完全被 yyy 取代了
在单调队列中找 iii 的最优决策点
考虑单调队列的队首决策点 xxx 和次队首决策点 yyy ,如果发现 midx,y≥imid_{x,y} \ge imidx,y≥i ,xxx 就被移除队首
移除结束后发现队首决策点 xxx 就是 iii 的最优决策点
把决策点 iii 加入队列中时次队尾决策点 xxx ,队尾决策点 yyy ,如果 midy,i≤midx,ymid_{y,i} \le mid_{x,y}midy,i≤midx,y , yyy 就被移除队尾
移除结束后把 iii 加入队尾
第二种情况
{∀j≤midx,yfy(j)<fx(j)∀j>midx,yfy(j)≥fx(j) \begin{cases} \forall_{j \le mid_{x,y}}f_y(j) < f_x(j)\\ \forall_{j > mid_{x,y}}f_y(j) \ge f_x(j) \end{cases} {∀j≤midx,yfy(j)<fx(j)∀j>midx,yfy(j)≥fx(j)
yyy 在 midx,ymid_{x,y}midx,y 之后被 xxx 取代
栈顶决策点 yyy 和次栈顶决策点 xxx ,如果 midx,y≥imid_{x,y} \ge imidx,y≥i ,yyy 就被移除栈
栈顶决策点 xxx 即为 iii 的最优决策点
栈顶决策点 yyy 和次栈顶决策点 xxx ,如果 midx,y≤midy,imid_{x,y} \le mid_{y,i}midx,y≤midy,i , yyy 就被移除栈,最后把 iii 加入栈顶
现在的问题在于如何找到 midx,ymid_{x,y}midx,y
对于大多数的问题,可以二分一个 midmidmid 在 log\loglog 时间复杂度内完成
但也有一部分问题 w(i,j)w(i,j)w(i,j) 是难以直接计算的,只能从 w(i,j−1)w(i,j-1)w(i,j−1) 推出来
此时如果满足 dpidp_idpi 和 dpjdp_jdpj 互不干涉,就可以二分考虑的点 iii ,暴力找出 iii 的最优决策点 xxx ,此时小于 iii 的位置决策点小于等于 xxx ,大于等于 iii 的位置决点大于等于 xxx ,这样一直递归下去即可
一般对于分层dp,从上一层的状态转移到当前层的状态满足互不干涉的性质,要求互不干涉的原因是可以在计算 iii 之前的dp值前可以先计算出 dpidp_idpi
递归的时间复杂度是 O(nlogn)O(n \log{n})O(nlogn) 的
更复杂的情况
dpi=min{dpj+AjBi+Cj+Di}j<i dp_i = min\{dp_j+A_jB_i+C_j+D_i\}_{j < i}dpi=min{dpj+AjBi+Cj+Di}j<i
其中 Aj,CjA_j,C_jAj,Cj 只和 jjj 有关, Bi,DiB_i,D_iBi,Di 之和 iii 有关
这时可以考虑斜率优化
转换为
dpj+Cj=BiAj+Di−dpi dp_j+C_j=B_iA_j+D_i-dp_i dpj+Cj=BiAj+Di−dpi
形如
y=kx+b y=kx+by=kx+b
每一个决策点 jjj 就对于平面上一个点 (x,y)=(Bi,dpj+Cj)(x,y)=(B_i,dp_j+C_j)(x,y)=(Bi,dpj+Cj)
BiB_iBi 就是给定一个直线的斜率
现在要求这条给定斜率的直线穿过给定点,交 yyy 轴于点 bbb ,这时 dpi=Di−bdp_i=D_i-bdpi=Di−b
要 dpidp_idpi 尽可能小只需要找到最小的 bbb 即可
根据不同题目的各个参数是否具备单调性 , 只需要以不同方式维护这些决策点 (一般是凸包) 即可解决
本文介绍了决策单调性优化动态规划的基础概念与应用方法,重点讨论了通过维持决策点的单调性来提高动态规划效率的技术,并提供了斜率优化的具体实例。
1946

被折叠的 条评论
为什么被折叠?



