决策单调性优化DP
决策单调性优化DP
何为决策单调性?
\(dp\) 转移时常会出现以下几种情形:(以 \(min\) 为例)
-
\(dp[i]=min_{j<i}(dp[j]+w(j,i))\)
-
\(dp[i][j]=min_{j<i}(dp[i-1][j]+w(j,i))\)
-
\(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\) 满足四边形不等式(交叉小于包含)。
据此我们可以证明情形一二的决策单调性:
设 \(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\),该长度下所有区间的枚举总量为:
展开后中间项相互抵消,得到:
由于 \(opt\) 取值在合法范围内,有上界 \(n-1\) 和下界 \(1\),所以:
总枚举次数:
综上所述,整体复杂度降为 \(O(n^2)\)。

浙公网安备 33010602011771号