决策单调性
蒙日矩阵
定义
若一个 \(n\times m\) 矩阵 \(A\) 满足 \(\forall1\leq i_1\leq i_2\leq n,1\leq j_1\leq j_2\leq m,A_{i_1,j_1}+A_{i_2,j_2}\leq A_{i_1,j_2}+A_{i_2,j_1}\),则称 \(A\) 是蒙日矩阵(Monge Matrix)。
形象地说就是选定这个矩阵的任意一个子矩阵,考察四个角上的元素,若 左上 \(+\) 右下 \(\leq\) 左下 \(+\) 右上,则其为蒙日矩阵。
另外,对于函数 \(w(l,r)\),若其满足 \(\forall1\leq l_1\leq l_2\leq n,1\leq r_1\leq r_2\leq m,w(l_1,r_1)+w(l_2,r_2)\leq w(l_1,r_2)+w(l_2,r_1)\),则称其满足四边形不等式。
其实是一个东西。
判定
若直接根据定义来判定,复杂度 \(O(n^2m^2)\),不优。下面给出一个简洁的判定形式:
\(\forall 1\leq i<n,1\leq j<m,A_{i,j}+A_{i+1,j+1}\leq A_{i,j+1}+A_{i+1,j}\Leftrightarrow A\) 是蒙日矩阵。
从右往左推显然,即为定义。下面证明从左往右:
移项可得:
对 \(A_{i,j+1}\) 做代换可得:
对 \(j\) 施加归纳,得到 \(\forall 1\leq i<n,1\leq j_1\leq j_2\leq m\),都有:
移项可得:
对 \(A_{i+1,j_1}\) 做代换可得:
对 \(i\) 施加归纳,得到 \(\forall1\leq i_1\leq i_2\leq n,1\leq j_1\leq j_2\leq m,A_{i_1,j_1}+A_{i_2,j_2}\leq A_{i_1,j_2}+A_{i_2,j_1}\),即 \(A\) 为蒙日矩阵。
形象地说,可以看做矩阵上原来相邻的四个格子横向拉开到任意长度,然后再竖向拉开到任意长度。
可以做到 \(O(nm)\) 判定。
决策单调性
定义 \(\operatorname{opt}(A,r)\) 为最大的 \(k\) 满足 \(A_{r,k}=\min_{i=1}^m\{A_{r,i}\}\)。
也就是说 \(\operatorname{opt}(A,r)\) 为 \(A\) 在 \(r\) 这一行上的最小值中最靠右的那一个的位置。
若 \(A\) 为蒙日矩阵,则 \(\operatorname{opt}(A,1)\leq \operatorname{opt}(A,2)\leq \cdots \leq \operatorname{opt}(A,n)\)。
要证明这个性质,只需要证明 \(\forall 1\leq i<n,\operatorname{opt}(A,i)\leq \operatorname{opt}(A,i+1)\)。
设 \(\operatorname{opt}(A,i)=x\),\(\operatorname{opt}(A,i+1)=y\)。假设 \(x>y\),则由 \(A\) 为蒙日矩阵,可以得到:
合并可以得到 \(A_{i+1,x}+A_{i,y}>A_{i,x}+A_{i+1,y}\),得出 \(A\) 不是蒙日矩阵,矛盾。
所以必然有 \(\forall 1\leq i<n,\operatorname{opt}(A,i)\leq \operatorname{opt}(A,i+1)\),进而原命题成立。
对于 DP 来讲,若 \(f_i\) 从 \(g_j\) 转移过来,则称 \(\operatorname{opt}(i)=j\)。有的 DP 同样也有类似的决策单调性性质,常用构造蒙日矩阵来证明 DP 的决策单调性。
拓展性质
- 若 \(A\) 为蒙日矩阵,则 \(A^T\) 为蒙日矩阵。
- 若给蒙日矩阵 \(A\) 的一行或一列同时加上一个数,则 \(A\) 仍然为蒙日矩阵。
原因显然。但是很有用。
蒙日矩阵行最小值求解及其应用
就是要对所有的 \(1\leq r\leq n\) 求出 \(\operatorname{opt}(A,r)\)。
离线分治算法
该算法要求 \(A\) 静态且 \(A\) 中元素能够快速计算或已知一个元素能快速计算其相邻元素。
设 \(\operatorname{solve}(l,r,L,R)\) 表示满足 \(L\leq\operatorname{opt}(A,l),\operatorname{opt}(A,r)\leq R\),求解 \(\operatorname{opt}(A,l)\sim \operatorname{opt}(A,r)\) 的函数。
很容易写出代码:
void solve(int l,int r,int L,int R){
if(l>r)return;
int mn=INF,mnpos=0;
int m=(l+r)>>1;
for(int i=L;i<=R;i++){
mn=min(mn,w(m,i));
if(mn==w(m,i))mnpos=i;
}
argmin[m]=mnpos;
solve(l,m-1,L,mnpos);
solve(m+1,r,mnpos,R);
}
不难分析出一共有 \(O(\log n)\) 层分治,每层分治 \(O(m)\),所以时间复杂度 \(O(m\log n)\)。
常用于优化 DP,形如:
其中 \(w\) 满足四边形不等式。构造矩阵 \(A\):
容易说明,\(A\) 为蒙日矩阵。则每层转移相当于求出 \(A\) 的 \(\operatorname{opt}\)。侧面说明了这个 DP 有决策单调性,于是套上分治即可 \(O(n\log n)\) 解决一层转移。
在线算法
该算法用于解决每次增量加入 \(A\) 的一列,快速维护 \(\operatorname{opt}\) 的情况。
维护一个队列,队列中元素为 \((l,r,p)\),表示当前状态下 \(\operatorname{opt}(A,l)\sim \operatorname{opt}(A,r)=p\)。初始时元素为 \((1,n,1)\)。
新加入一列 \(k\),考虑队尾元素 \((l,r,p)\),如果 \(A_{l,p}\geq A_{l,k}\),由于决策单调性,说明 \(p\) 这一列已经没用了,直接弹出队列。一直到队列为空或队尾元素 \((l,r,p)\) 满足 \(A_{r,p}\geq A_{r,k},A_{l,p}<A_{l,k}\),则这其中一定存在一个分界点 \(m\in[l,r)\) 满足 \(\operatorname{opt}(A,l)\sim \operatorname{opt}(A,m)=p,\operatorname{opt}(A,m+1)\sim \operatorname{opt}(A,r)=k\)。此时二分出这个 \(m\),然后更新队列即可。
至于为什么要用队列而不是栈,原因是当前加入的这一列元素的值可能与前面求出的 \(\operatorname{opt}\) 有关。这种矩阵一般上半三角元素都为 \(+\infin\),所以加入第 \(k\) 列时前 \(k-1\) 行的 \(\operatorname{opt}\) 都已经确定了。
常用于优化 DP,形如:
其中 \(w\) 满足四边形不等式。构造蒙日矩阵 \(A\):
相当于增量加列求 \(A\) 的 \(\operatorname{opt}\),侧面说明了这个 DP 有决策单调性。
下面给出优化这种形式 DP 的常用模板:
deque<Opt> q;
q.push_back({1,n,0});
for(int i=1;i<=n;i++){
while(q.size()>1&&q.front().r<i)q.pop_front();
f[i]=w(opt[i]=q.front().p,i);
while(q.size()>1&&w(i,q.back().l)<=w(q.back().p,q.back().l))q.pop_back();
int l=q.back().l,r=n+1;
while(l<r){
int mi=(l+r)>>1;
if(w(i,mi)<=w(q.back().p,mi))r=mi;
else l=mi+1;
}
if(l>n)continue;//?
q.back().r=l-1;
q.push_back({l,n,i});
}
例题
重点在于证明决策单调性。
P3515
即对于每个 \(i\) 求出 \(\max_j\{h_j+\sqrt{|i-j|}\}-h_i\)。常数项 \(h_i\) 可以直接扔了,最后再减回来。
不妨先全部取相反数,最后再取回来。转化为求 \(\min_{j}\{-h_j-\sqrt{|i-j|}\}\)。
构造矩阵 \(A_{i,j}=-h_j-\sqrt{|i-j|}\)。现在希望证明 \(A\) 是蒙日矩阵。注意到 \(-h_j\) 一项相当于给 \(j\) 这一列同时加上 \(-h_j\),则现在可以转化为证明 \(A_{i,j}=-\sqrt{|i-j|}\) 是蒙日矩阵。
用判定法证明:
感受一下,\(\sqrt x\) 是凸的,所以 \(+1\) 带来的增量必然小于 \(-1\) 带来的减量,于是得证。
离线分治即可 \(O(n\log n)\) 解决该问题。

浙公网安备 33010602011771号