决策单调性优化DP

决策单调性优化DP

何为决策单调性?

\(dp\) 转移时常会出现以下几种情形:(以 \(min\) 为例)

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

  2. \(dp[i][j]=min_{j<i}(dp[i-1][j]+w(j,i))\)

  3. \(dp[l][r]=min_{l\le k\le r}(dp[l][k]+dp[k+1][j])+w(i,j)\)

当前状态从哪里转移来,哪里就是最优决策点。(如最优决策点 \(j\) 是满足 \(dp[j]+w(j,i)\) 最小的 \(j\)

决策单调性顾名思义就是最优决策点的移动是有规律的。

以第一种情形来说就是 \(i\) 的最优决策点一定小于等于 \(i+1\) 的最优决策点。

那么借助这个性质就可以优化 \(dp\)

决策单调性的判定条件:

四边形不等式:

对于代价函数 \(w(l,r)\) ,若对于任意 \(a\le b\le c \le d\) ,满足:

\[w(a,c)+w(b,d)\le w(a,d)+w(b,c) \]

则称 \(w\) 满足四边形不等式(交叉小于包含)。

据此我们可以证明情形一二的决策单调性

\(dp[i]\) 的最优决策点为 \(j\) ,然后随便指定一个点 \(k\) 使得 \(k< j\) ,已知 \(dp[k]+w(k,i)\ge dp[j]+w(j,i)\)

那么:

\(dp[i+1]\)\(dp[k]\) 转移的代价为 \(dp[k]+w(k,i+1)\) ,从 \(dp[j]\) 转移的代价是 \(dp[j]+w(j,i+1)\)

因为 \(dp[k]+w(k,i)\ge dp[j]+w(j,i)\),所以 \(dp[k]-dp[j]\ge w(j,i)-w(k,i)\)

根据决策单调性,\(w(j,i)-w(k,i)\le w(j,i+1)-w(k,i+1)\)

所以 \(dp[k]-dp[j]\ge w(j,i+1)-w(k,i+1)\)

移项后就得到了 \(dp[k]+w(k,i+1)\ge dp[j]+w(j,i+1)\)

故最优决策点一定单调不降。

如果 \(w(l,r)\) 还额外满足 \(w(b,c)\le w(a,d)\) ,那么就能推出区间 \(dp\) 的决策单调性(即情形三):

先证明 \(dp\) 数组也满足四边形不等式(用归纳法,这里省略,具体见DP满足四边形形不等式证明)。

证明 \(opt[l][r - 1] \leq opt[l][r]\)

\(p = opt[l][r - 1]\),即 \(p\) 是区间 \([l, r - 1]\) 的最优分割点。

我们需证明:

\(dp[l][p] + dp[p + 1][r] \leq dp[l][k] + dp[k + 1][r]\) ( \(k < p\)

(注意两边都少了相同的 \(w(l, r)\),所以比较时可以省略。)

因为 \(p\)\([l, r - 1]\) 的最优分割点,所以对于所有 \(k < p\),有:

\(dp[l][p] + dp[p + 1][r - 1] \leq dp[l][k] + dp[k + 1][r - 1]\) (1)

由于 \(k + 1 \leq p + 1 \leq r - 1 \leq r\)

应用四边形不等式到 \(a = k + 1, b = p + 1, c = r - 1, d = r\)

\(dp[k + 1][r - 1] + dp[p + 1][r] \leq dp[k + 1][r] + dp[p + 1][r - 1]\) (2)

将 (1) 和 (2) 相加:

左边相加:

\(dp[l][p] + dp[p + 1][r - 1] + dp[k + 1][r - 1] + dp[p + 1][r]\)

右边相加:

\(dp[l][k] + dp[k + 1][r - 1] + dp[k + 1][r] + dp[p + 1][r - 1]\)

注意到两边都有 \(dp[p + 1][r - 1]\)\(dp[k + 1][r - 1]\),它们会抵消。相加后得到:

\(dp[l][p] + dp[p + 1][r] \leq dp[l][k] + dp[k + 1][r]\)

因此对于任何 \(k < p\),用 \(p\) 分割 \([l, r]\) 的代价都不大于用 \(k\) 分割的代价。

所以最优分割点 \(opt[l][r]\) 不可能小于 \(p\),即 \(opt[l][r] \geq opt[l][r - 1]\)。这证明了左不等式。

右不等式同理。

怎么优化DP?

乍一看好像直接双指针优化就行了,因为每一步并没有保证从 \(1-i\) 是一个单峰函数。

也就是说可能指针 \(p\) 发现 \(p+1\) 的值比 \(p\) 要大,就不走了。但实际最小值可能是在 \(p+2\) 的位置。

那怎么做呢,这里分情况讨论:

第一种情况:\(dp[i]=min_{j<i}(dp[j]+w(j,i))\)

维护一些决策三元组(恰好覆盖 \([1-n]\) ),形如 \((j,l,r)\) 表示 \(j\) 这个决策点在 \([l,r]\) 是最优的。

最初是的决策三元组是 \((0,1,n)\)

处理 \(dp[i]\) 时从队首开始看,如果当前队首的决策三元组的区间包含 \(i\) (即 \(r\ge i\) ),那么就可以直接从这个决策点转移,否则就直接弹出队首。

然后考虑用 \(dp[i]\) 去更新决策三元组,也就是我们想知道哪一段区间的最优决策点能更新为 \(i\) 。(下文中管辖的定义:若某区间的最优决策点都是 \(i\) ,则称 \(i\) 管辖这段区间)

从队尾往前看:

首先,队尾的决策三元组的最优决策点一定是小于 \(i\) 的。

其次,根据决策单调性,越靠后的点的决策最优点越有可能是 \(i\)

因此大致想到去二分答案,但是现在二分的区间(\([i+1-n]\))可能被很多个决策三元组切碎了。

但是发现只需要判断某个决策三元组区间起点 \(l\)\(j\) 转移和从 \(i\) 转移哪个更优,就能判断这个区间应不应该全部划给 \(i\) 管辖。(决策单调性: \(l\) 的决策点中 \(i\) 优于 \(j\) ,后面的那 \(i\) 就更优于 \(j\)

先把队尾所有被 \(i\) 管辖的区间弹出(如下图中删除区间 \([r+1,n]\)),然后在不能完全划给 \(i\) 管辖的区间里面二分出一个分界线,那么分界线后面就都归 \(i\) 管辖。

如图所示,假设区间 \([l+1,r]\)\(j\) 管辖。

那么二分一个 \(mid\) ,使得 \(mid\)\(i\) 转移更优,而 \(mid-1\)\(j\) 转移更优。

所以删除三元组 \((j,l,r)\)

然后加入 \((j,l,mid-1)\) 以及 \((i,mid,n)\)

第二种情况:\(dp[i][j]=min_{j<i}(dp[i-1][j]+w(j,i))\)

当前层只依赖于上一层的结果,那么可以分批处理。

对于第 \(i\) 层的 \(dp[l...r]\),已知最优决策范围为 \([optL,optR]\)

取中点 \(mid\) ,那么暴力遍历 \([optL,optR]\) 可以找到 \(mid\) 的的最优决策点 \(optM\)

那么 \(dp[l...mid]\) 的最优决策范围为 \([optL,optM]\)

\(dp[mid+1...r]\) 的最优决策范围为 \([optM+1,optR]\)

故可以分治递归处理。

这样总时间复杂度从 \(O(n^3)\) 优化到了 \(O(n^2log\,n)\)

第三种情况:\(dp[l][r]=min_{l\le k\le r}(dp[l][k]+dp[k+1][j])+w(i,j)\)

\(opt[l][r]\) 为区间 \([l,r]\) 的最优决策点。那么根据决策单调性,有 \(opt[l][r-1]\le opt[l][r]\le opt[l+1][r]\)

即:区间向左扩张,最优化决策点不会右移,当向右扩张时最优决策点不会左移。

那么据此我们就可以只枚举 \(k\in [opt[l][r-1],opt[l+1][r]]\)

时间复杂度分析:

固定长度 \(len = r-l+1\),该长度下所有区间的枚举总量为:

\[S_{len} = \sum_{l=1}^{n-len+1} \Big( opt[l+1][l+len-1] - opt[l][l+len-2] + 1 \Big) \]

展开后中间项相互抵消,得到:

\[S_{len} = opt[n-len+2][n] - opt[1][len-1] + (n-len+1) \]

由于 \(opt\) 取值在合法范围内,有上界 \(n-1\) 和下界 \(1\),所以:

\[S_{len} \le 2n - len - 1 = O(n) \]

总枚举次数:

\[\sum_{len=1}^{n} S_{len} \le \sum_{len=1}^{n} O(n) = O(n^2) \]

综上所述,整体复杂度降为 \(O(n^2)\)

posted @ 2026-09-06 16:46  wlhao  阅读(4)  评论(0)    收藏  举报