决策单调性优化 dp 学习笔记

决策单调性一般可用观察法/分析四边形不等式得出,这里主要介绍四边形不等式。

在这里我们只讨论代价为二元函数 w(l,r)w(l,r) 的 dp。

Part 1 定义 & 性质

1.1 dp 维数定义

描述 dp 的时间复杂度时,往往会用 xD/yD 这样的说法,其中 xx状态数logn\text{状态数}\log nyy单次转移复杂度logn\text{单次转移复杂度}\log n

例如 fl,r=k=l+1rfl,k1+fk,rf_{l,r}=\sum\limits_{k=l+1}^rf_{l,k-1}+f_{k,r} 是 2D/1D 的 dp。

1.2 决策单调性

设 dp 的状态集合为 SS,状态 uu 的最优决策点为 opt(u)\text{opt}(u)

i,jS,i<j\forall i,j\in S,i<j 都有 opt(i)opt(j)\text{opt}(i)\le\text{opt}(j),则称该 dp 满足决策单调性。

1.3 区间包含单调性和四边形不等式

这两个东西都是定义在二元函数 f(l,r)f(l,r) 上的。

1.3.1 区间包含单调性

llrr\forall l\le l'\le r'\le r,都有 f(l,r)f(l,r)f(l',r')\le f(l,r),则称 ff 满足区间包含单调性。

1.3.2 四边形不等式

llrr\forall l\le l'\le r'\le r,都有 f(l,r)+f(l,r)f(l,r)+f(l,r)f(l,r')+f(l',r)\le f(l,r)+f(l',r'),则称 ff 满足四边形不等式。

即相交小于包含。

1.3.3 一些帮助证明的性质

  • w(l+1,r)w(l,r)w(l+1,r)\le w(l,r)w(l,r1)w(l,r)w(l,r-1)\le w(l,r),则可以归纳证明 w(l,r)w(l,r) 满足区间包含单调性;
  • w(l+1,r)+w(l,r1)w(l,r)+w(l+1,r1)w(l+1,r)+w(l,r-1)\le w(l,r)+w(l+1,r-1),则可以归纳证明 w(l,r)w(l,r) 满足四边形不等式;
  • 线性性:若 f(l,r)f(l,r)g(l,r)g(l,r) 均满足区间包含单调性 / 四边形不等式,则 c1,c20\forall c1,c2\ge 0c1×f(l,r)+c2×g(l,r)c1\times f(l,r)+c2\times g(l,r) 也满足区间包含单调性 / 四边形不等式;
  • w(l,r)=f(r)g(l)w(l,r)=f(r)-g(l)
    • w(l,r)w(l,r) 满足四边形恒等式(\le 恒取 ==);
    • f,gf,g 均单调不增,则 w(l,r)w(l,r) 还满足区间包含单调性;
  • f(x)f(x) 为下凸函数(导数不降),w(l,r)w(l,r) 满足区间包含单调性和四边形不等式:
    • f(w(l,r))f(w(l,r)) 满足四边形不等式;
    • f(x)f(x) 单调不降,则 f(w(l,r))f(w(l,r)) 还满足区间包含单调性;
证明

(2):

w(l+1,r)+w(l,r1)w(l,r)+w(l+1,r1)(1)w(l+1,r1)+w(l,r2)w(l,r1)+w(l+1,r2)(2)w(l+1,r)+w(l,r1)+w(l+1,r1)+w(l,r2)w(l,r)+w(l+1,r1)+w(l,r1)+w(l+1,r2)(1)+(2)w(l+1,r)+w(l,r2)w(l,r)+w(l+1,r2)\begin{aligned} w(l+1,r)+w(l,r-1)\le w(l,r)+w(l+1,r-1)\qquad&(1)\\ w(l+1,r-1)+w(l,r-2)\le w(l,r-1)+w(l+1,r-2)\qquad&(2)\\ w(l+1,r)+w(l,r-1)+w(l+1,r-1)+w(l,r-2)\\ \le\\w(l,r)+w(l+1,r-1)+ w(l,r-1)+w(l+1,r-2)\\ &(1)+(2)\\ w(l+1,r)+w(l,r-2)\le w(l,r)+w(l+1,r-2) \end{aligned}

(5).1:不会证,感性理解一下:

  • 满足区间包含单调性:更长的区间 w(l,r)w(l,r) 更大;
  • 下凸函数:更大的 w(l,r)w(l,r) 增长得更快;
  • 原本就满足四边形不等式:相交总和更小;

Part 2 应用

这里默认代价函数为二元函数 w(l,r)w(l,r),且该函数计算时间复杂度为 O(1)O(1)

2.1 优化 1D/1D dp

w(l,r)w(l,r) 满足四边形不等式,则如下 1D/1D dp 存在决策单调性:

fi=minj=0i1{w(j+1,i)}朴素形fi=minj=0i1{fj+w(j+1,i)}区间划分形f_i=\min\limits_{j=0}^{i-1}\{w(j+1,i)\}\qquad\text{朴素形}\\ f_i=\min\limits_{j=0}^{i-1}\{f_j+w(j+1,i)\}\qquad\text{区间划分形}

i<j\forall i<jopt(i)opt(j)\text{opt}(i)\le \text{opt}(j)

证明

先证明第二个:

解释:若出现上面的情况,则可以交换变成下面的情况,fi+fjf_i+f_{j} 变小,与 fif_ifjf_j 均为最小值相悖。

第一个只不过是把黑色部分去掉了。

那么就可以分治或者在队列上二分来快速转移,时间复杂度 O(nlogn)O(n\log n)

2.1.1 分治优化转移

该方法仅适用于转移不依赖之前状态的情况(朴素形),在这种情况下,仅需求出 opt(i)\text{opt}(i) 即可得出 fif_i

考虑分治,令 mid=n2mid=\lfloor\frac{n}{2}\rfloor,先求出 k=opt(mid)k=\text{opt}(mid),接下来:

  • 对于 i[1,mid1]i\in[1,mid-1]opt(i)k\text{opt}(i)\le k
  • 对于 i[mid+1,n]i\in [mid+1,n]opt(i)k\text{opt}(i)\ge k

那么在分治的时候记录 opt(i)\text{opt}(i) 的上下界即可。这样分治树的高度为 O(logn)O(\log n),每一层每一个转移点只会被遍历到最多两次,总时间复杂度即为 O(nlogn)O(n\log n)

示例代码

void dfs(int opt[],int(*calw)(int,int),int l,int r,int kl,int kr)
{
	if(l>r) return;
	int mid=l+r>>1,k=kl;
	for(int i=kl;i<=kr&&i<=mid;i++)
	{
		if(calw(i,mid)<calw(k,mid)) k=i;
	}
	opt[mid]=k;
	dfs(opt,calw,l,mid-1,kl,k);
	dfs(opt,calw,mid+1,r,k,kr);
}

例题:P3515 [POI2011] Lightning Conductor

题解

考虑拆成两半求解,先求满足 [1,i][1,i]pp,再求满足 [i,n][i,n]pp,取 max\max

fif_i 为前一半的 pp,有:

fi=maxj<i{aj+ijai}=minj<i{aiajij}\begin{aligned} f_i&=\max\limits_{j<i}\{a_j+\sqrt{i-j}-a_i\}\\ &=-\min\limits_{j<i}\{a_i-a_j-\sqrt{i-j}\} \end{aligned}

由于 w1(j,i)=ijw1(j,i)=-\sqrt{i-j}w2(j,i)=aiajw2(j,i)=a_i-a_j 都满足四边形不等式,所以 w(j,i)=w1(j,i)+w2(j,i)w(j,i)=w1(j,i)+w2(j,i) 也满足四边形不等式。

那么直接分治优化转移即可,时间复杂度 O(nlogn)O(n\log n)

记得寻找 opt(i)\text{opt}(i) 时代价不能上取整,要最后再上取整。

参考代码

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

typedef long double db;

const int S=500005;

int n,a[S];
int opt1[S],opt2[S];
int ans[S];

inline db calw(int l,int r)
{
	return a[r]-a[l]-sqrt((db)(r-l));
}

void dfs(int opt[],db(*calw)(int,int),int l,int r,int kl,int kr)
{
	if(l>r) return;
	int mid=l+r>>1,k=kl;
	for(int i=kl;i<=kr&&i<=mid;i++)
	{
		if(calw(i,mid)<calw(k,mid)) k=i;
	}
	opt[mid]=k;
	dfs(opt,calw,l,mid-1,kl,k);
	dfs(opt,calw,mid+1,r,k,kr);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	dfs(opt1,calw,1,n,1,n);
	for(int i=1;i<=n;i++) ans[i]=ceil(-calw(opt1[i],i));
	for(int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]);
	dfs(opt2,calw,1,n,1,n);
	for(int i=1;i<=n;i++) ans[n-i+1]=max(ans[n-i+1],(int)ceil(-calw(opt2[i],i)));
	for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
	return 0;
}

练习:Loj #6039. 「雅礼集训 2017 Day5」珠宝 /「NAIPC2016」Jewel Thief

2.1.2 二分队列优化转移

该方法适用于转移依赖之前状态的情况(区间划分形)。

观察到对于特定的 jjopt(i)=j\text{opt}(i)=jii 肯定形成一个区间。

那么不妨用单调队列维护 jj 和其对应的区间 [lj,rj][l_j,r_j],队头为 ljl_j 最小的,队尾为 ljl_j 最大的。

每次转移到新的 ii 时:

  • 先把队头 rj<ir_j<i 的决策点弹掉,得到 opt(i)\text{opt}(i),从而得到 fif_i,令队头 lj=i+1l_j=i+1
  • 然后对于队尾决策点 jj,若 fi+w(i+1,lj)<fj+w(j+1,lj)f_i+w(i+1,l_j)<f_j+w(j+1,l_j) 则弹掉队尾;
  • 若队列为空,加入决策 ii,令 li=i+1l_i=i+1ri=nr_i=n
  • 否则二分找到分界点再加入决策 ii

这样每个决策点最多只会入队一次,所以总时间复杂度为均摊 O(nlogn)O(n\log n)

参考代码

lb[0]=1,rb[0]=n;
hed=1,til=0;
que[++til]=0;
f[0]=0;
for(int i=1;i<=n;i++)
{
	while(rb[que[hed]]<i) hed++;
	int opti=que[hed];
	f[i]=f[opti]+calw(opti+1,i);
	if(rb[opti]==i) hed++;
	else lb[opti]=i+1;
	while(hed<=til&&
		f[i]+calw(i+1,lb[que[til]])
					<
		f[que[til]]+calw(que[til]+1,lb[que[til]])
	) til--;
	if(hed>til)
	{
		if(i<n)
		{
			lb[i]=i+1,rb[i]=n;
			que[++til]=i;
		}
	}
	else
	{
		int j=que[til];
		int l=lb[j],r=rb[j],p=lb[j];
		while(l<=r)
		{
			int mid=l+r>>1;
			if(f[j]+calw(j+1,mid)<f[i]+calw(i+1,mid)) p=mid,l=mid+1;
			else r=mid-1;
		}
		rb[j]=p;
		if(p<n)
		{
			lb[i]=p+1,rb[i]=n;
			que[++til]=i;
		}
	}
}

例题:P3195 [HNOI2008] 玩具装箱

题解

fif_i 表示 [1,i][1,i] 的代价,那么有转移:

fi=min0j<i{fj+w(j+1,i)}f_i=\min\limits_{0\le j<i}\{f_j+w(j+1,i)\}

其中 w(l,r)=(rl+lkrCkL)2w(l,r)=(r-l+\sum\limits_{l\le k\le r}C_k-L)^2

Si=1jiCjS_i=\sum\limits_{1\le j\le i}C_j,那么 w(l,r)=(rl+SrSl1L)2w(l,r)=(r-l+S_r-S_{l-1}-L)^2

显然 rl+SrSl1Lr-l+S_r-S_{l-1}-L 满足区间包含单调性和四边形不等式,由于 f(x)=x2f(x)=x^2 是下凸函数,所以 w(l,r)w(l,r) 满足四边形不等式。

那么直接二分队列优化转移即可,时间复杂度 O(nlogn)O(n\log n)

参考代码

#include <iostream>
#include <cstdio>

using namespace std;

typedef long long ll;

const int S=50005;

int n,L;
ll a[S];
int lb[S],rb[S];
int hed,til,que[S];
ll f[S];

inline ll calw(int l,int r)
{
	ll x=r-l+a[r]-a[l-1];
	return (x-L)*(x-L);
}

int main()
{
	scanf("%d%d",&n,&L);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]),a[i]+=a[i-1];
	lb[0]=1,rb[0]=n;
	hed=1,til=0;
	que[++til]=0;
	f[0]=0;
	for(int i=1;i<=n;i++)
	{
		while(rb[que[hed]]<i) hed++;
		int opti=que[hed];
		f[i]=f[opti]+calw(opti+1,i);
		if(rb[opti]==i) hed++;
		else lb[opti]=i+1;
		while(hed<=til&&
			f[i]+calw(i+1,lb[que[til]])
						<
			f[que[til]]+calw(que[til]+1,lb[que[til]])
		) til--;
		if(hed>til)
		{
			if(i<n)
			{
				lb[i]=i+1,rb[i]=n;
				que[++til]=i;
			}
		}
		else
		{
			int j=que[til];
			int l=lb[j],r=rb[j],p=lb[j];
			while(l<=r)
			{
				int mid=l+r>>1;
				if(f[j]+calw(j+1,mid)<f[i]+calw(i+1,mid)) p=mid,l=mid+1;
				else r=mid-1;
			}
			rb[j]=p;
			if(p<n)
			{
				lb[i]=p+1,rb[i]=n;
				que[++til]=i;
			}
		}
	}
	printf("%lld\n",f[n]);
	return 0;
}

2.2 优化 2D/1D dp

2.2.1 恰好 kk 段的区间划分形

w(l,r)w(l,r) 满足四边形不等式,则如下 2D/1D dp 存在决策单调性:

fi,k=min0j<i{fj,k1+w(j+1,i)}f_{i,k}=\min\limits_{0\le j<i}\{f_{j,k-1}+w(j+1,i)\}

即满足 opt(i,k1)opt(i,k)opt(i+1,k)\text{opt}(i,k-1)\le\text{opt}(i,k)\le \text{opt}(i+1,k)

证明

opt(i,k)opt(i+1,k)\text{opt}(i,k)\le \text{opt}(i+1,k) 套用 1D/1D 的区间划分形 dp 的证明方法即可,仅需证明 opt(i,k1)opt(i,k)\text{opt}(i,k-1)\le \text{opt}(i,k)

不会证,感性理解一下。

并且这类问题有个神奇的性质(同样不会证):

fi,kf_{i,k} 是关于 kk 的下凸函数。

感性理解一下就是刚开始分的越多越好,超过一个临界点分多点反而不好了。

也就是说,这类问题都可以 wqs 二分。

2.2.2 区间合并形

w(l,r)w(l,r) 满足四边形不等式和区间包含单调性,则如下 2D/1D dp 存在决策单调性:

fl,r=minlk<r{fl,k+fk+1,r}+w(l,r)f_{l,r}=\min\limits_{l\le k< r}\{f_{l,k}+f_{k+1,r}\}+w(l,r)

即满足 opt(l,r1)opt(l,r)opt(l+1,r)\text{opt}(l,r-1)\le\text{opt}(l,r)\le \text{opt}(l+1,r),且 fl,rf_{l,r} 也满足四边形不等式。

并且若 w(l,r)w(l,r)fl,rf_{l,r} 均非负,fl,rf_{l,r} 也满足区间包含单调性。

证明

四边形不等式和区间包含单调性的证明:

  • 四边形不等式:

    考虑归纳,lr2l\ge r-2 时显然成立。

    仅需证明 fl,r1+fl+1,rfl,r+fl+1,r1f_{l,r-1}+f_{l+1,r}\le f_{l,r}+f_{l+1,r-1}

    不妨设 opt(l,r)=k\text{opt}(l,r)=k

    • k=lk=lk=r1k=r-1

      这里假设 k=r1k=r-1,另一种情况同理。

      有:

      fl,r+fl+1,r1=fl,k+fk+1,r+w(l,r)+fl+1,r1=fl,r1+fr,r+w(l,r)+fl+1,r1\begin{aligned} f_{l,r}+f_{l+1,r-1}&=f_{l,k}+f_{k+1,r}+w(l,r)+f_{l+1,r-1}\\ &=f_{l,r-1}+f_{r,r}+w(l,r)+f_{l+1,r-1}\\ \end{aligned}

      由于 w(l,r)w(l,r) 满足区间包含单调性,所以 w(l,r1)w(l,r)w(l,r-1)\le w(l,r),那么有:

      fl,r+fl+1,r1fl,r1+fr,r+w(l,r1)+fl+1,r1fl,r1+fl+1,r\begin{aligned} f_{l,r}+f_{l+1,r-1}&\ge f_{l,r-1}+f_{r,r}+w(l,r-1)+f_{l+1,r-1}\\ &\ge f_{l,r-1}+f_{l+1,r}\\ \end{aligned}

      最后一步是根据 dp 转移式得到的。

    • l<k<r1l<k<r-1

      此时设 opt(l+1,r1)=p\text{opt}(l+1,r-1)=p,不妨假设 kpk\le pk>pk>p 同理:

      fl,r+fl+1,r1=fl,k+fk+1,r+w(l,r)+fl+1,p+fp+1,r1+w(l+1,r1)fk+1,r1+fp+1,r+fl,k+fl+1,p+w(l,r)+w(l+1,r1)fk+1,r1+fp+1,r+fl,k+fl+1,p+w(l,r1)+w(l+1,r)fl,r1+fl+1,r\begin{aligned} f_{l,r}+f_{l+1,r-1}&=f_{l,k}+f_{k+1,r}+w(l,r)+f_{l+1,p}+f_{p+1,r-1}+w(l+1,r-1)\\ &\ge f_{k+1,r-1}+f_{p+1,r}+f_{l,k}+f_{l+1,p}+w(l,r)+w(l+1,r-1)\\ &\ge f_{k+1,r-1}+f_{p+1,r}+f_{l,k}+f_{l+1,p}+w(l,r-1)+w(l+1,r)\\ &\ge f_{l,r-1}+f_{l+1,r} \end{aligned}

      其中:

      • 第二个不等式是因为根据归纳假设,有 fk+1,r1+fp+1,rfk+1,r+fp+1,r1f_{k+1,r-1}+f_{p+1,r}\le f_{k+1,r}+f_{p+1,r-1}
      • 第三个不等式是因为 w(l,r)w(l,r) 满足四边形不等式;
      • 第四个不等式是根据 dp 转移式得到的;
  • 区间包含单调性:

    证明起来比较简单,依旧考虑归纳,l=rl=r 时显然成立。

    仅需证明 fl,r1fl,rf_{l,r-1}\le f_{l,r}fl+1,rfl,rf_{l+1,r}\le f_{l,r}

    这里证明 fl,r1fl,rf_{l,r-1}\le f_{l,r},另一个的证明是一样的。

    opt(l,r)=k\text{opt}(l,r)=k

    • lk<r1l\le k<r-1

      有:

      fl,r=fl,k+fk+1,r+w(l,r)fl,k+fk+1,r1+w(l,r1)fl,r1\begin{aligned} f_{l,r}&=f_{l,k}+f_{k+1,r}+w(l,r)\\ &\ge f_{l,k}+f_{k+1,r-1}+w(l,r-1)\\ &\ge f_{l,r-1} \end{aligned}

      其中:

      • 第二个不等式是因为 w(l,r)w(l,r) 满足区间包含单调性,并且根据归纳假设,有 fk+1,r1fk,rf_{k+1,r-1}\le f_{k,r}
      • 第三个不等式是根据 dp 转移式得到的;
    • k=r1k=r-1

      opt(l,r1)=p\text{opt}(l,r-1)=p,有:

      fl,r=fl,r1+fr,r+w(l,r)\begin{aligned} f_{l,r}&=f_{l,r-1}+f_{r,r}+w(l,r) \end{aligned}

      由于 w(l,r)w(l,r) 非负,fr,rf_{r,r} 也非负,所以 fl,rfl,r1f_{l,r}\ge f_{l,r-1}

决策单调性的证明:

根据决策单调性,我们在 dp 的时候就可以记录 opt(l,r)\text{opt}(l,r),转移的时候先枚举区间长度,枚举 kk 只在 opt(l,r1)\text{opt}(l,r-1)opt(l+1,r)\text{opt}(l+1,r) 之间枚举。这样长度相同的区间的枚举 kk 的时间复杂度总和是 O(n)O(n) 的,那么整体时间复杂度也就是 O(n2)O(n^2) 的了。

例题:石子合并(加强版)

有 n 堆石子排成一个环,第 ii 堆石子有 aia_i 个。

可以把相邻的两堆石子合并为一堆,合并的代价为两堆石子的个数之和,求把所有石子合并成一堆的最小代价和最大代价。

1n25001\le n\le 2500

题解

先段环为链,设 si=j=1iajs_{i}=\sum\limits_{j=1}^i a_jfl,rf_{l,r} 为把 a[l,r]a_{[l,r]} 合并为一堆的最小代价,那么有转移:

fl,r=minlk<r{fl,k+fk+1,r}+srsl1f_{l,r}=\min\limits_{l\le k<r}\{f_{l,k}+f_{k+1,r}\}+s_{r}-s_{l-1}

显然由于 aia_i 非负,所以 w(l,r)=srsl1w(l,r)=s_r-s_{l-1} 满足区间包含单调性和四边形不等式,那么 fl,rf_{l,r} 满足决策单调性,所以可以直接优化到 O(n2)O(n^2)

2.3 更多练习

Upd 20250206 更具有启发性的严格定义

关于单调性的定义

启发:对于这种二维的事物,不妨考虑矩阵/二维平面。

仅考虑最小化的情况,最大化情况同理。

关于最小值的位置,若有多个则默认为第一个。

  • 单调矩阵 An×mA_{n\times m}:设 mini\min_i 为第 ii 行的最小值的位置,则 i1<i2\forall i_1< i_2,有 mini1mini2\min_{i_1}\le \min_{i_2}
  • 完全单调矩阵 Cn×mC_{n\times m}:对于其所有子矩阵 AA(不一定要连续),AA 都是单调矩阵;
  • 蒙日矩阵 Mn×mM_{n\times m}:对于任意一个 2×22\times 2 的子矩阵 [abcd]\begin{bmatrix}a&b\\c&d\end{bmatrix}(不一定要连续),其满足 a+db+ca+d\le b+c(相交小于包含);

一些性质

  • 蒙日矩阵一定是完全单调矩阵。

单调矩阵一般都是完全单调矩阵,而大部分完全单调矩阵都是蒙日矩阵。

  • 根据定义,不难发现仅需 check 2×22\times 2 的子矩阵即可得知一个矩阵是否完全单调,相当于对于所有 2×22\times 2 的子矩阵 [abcd]\begin{bmatrix}a&b\\c&d\end{bmatrix} 都需要满足 [ab]+[c>d]>0[a\le b]+[c>d]>0,即这两个条件至少满足一个;

那么由此可以得出一个性质:

  • 对于一个完全单调矩阵 CC 的任意两列 j1j_1j2j_2,其对应位置的值的某个前缀满足 $\le $,剩下的后缀满足 >>,如图:

并且也可以证明蒙日矩阵一定是完全单调矩阵,反证法:若 a>ba>bcdc\le d,则一定有 a+d>b+ca+d>b+c

  • 根据蒙日矩阵的定义,check 一个矩阵 Mn×mM_{n\times m} 是否蒙日矩阵仅需 check 2×22\times 2连续子矩阵即可;

    因为若 a+db+ca+d\le b+ca+dbc0a+d-b-c\le 0,注意到这个是二维差分的形式,即 MM 可以看作一个非正矩阵的二维前缀和,而 2×22\times 2 的子矩阵(不一定连续)的 a+dbca+d-b-c 相当于该非正矩阵一个矩形中数的和,显然其也非正;

    故证明四边形不等式时仅需考虑 [l,r][l,r][l+1,r+1][l+1,r+1]

  • 给蒙日矩阵中某一行整体加同一个数,矩阵仍是蒙日矩阵;

关于应用的定义

蒙日矩阵一般都是定义在区间上的,即 Mn×nM_{n\times n},其中 Mi,jM_{i,j} 是区间 [i,j][i,j] 的代价。

这样定义会带来一些问题,因为 i>ji>j 的区间不存在,若将其简单定义为 \infin 则会导致形如 [a]\begin{bmatrix}\infin&a\\\infin&\infin\end{bmatrix} 的子矩阵会导出 ++a\infin+\infin\le \infin+a 的错误式子,且形如 [ab]\begin{bmatrix}\infin&a\\\infin&b\end{bmatrix} 的子矩阵会导出 bab\le a 的不一定成立的式子(给某一行整体加同一个数不改变蒙日性,但此时可能有 b>ab>a)。

一个聪慧的构造是考虑令 i<ji<jMi,j=(ji)2×M_{i,j}=(j-i)^2\times \infin,不难验证该构造满足蒙日性。

分治优化

本质其实是找到矩阵中第 midmid 行的最小值的位置,并分治处理左和右下矩阵:

所以该方法仅要求矩阵是单调矩阵。

二分队列优化

本质上是从左往右扫每一列,对于每列维护出最小值在该列的行的区间,每次插入一列的时候干掉一个后缀的区间并插入一个新区间:

所以该方法仅要求矩阵是完全单调矩阵。

蒙日矩阵最短路——区间划分型 dp

不难发现,若将区间 (l,r](l,r] 的代价对应的蒙日矩阵看作 nn 个点的图 GG 的邻接矩阵,则序列的最小代价区间划分对应着由 00nn 的最短路。特别的,任意两点 l,rl,r 间的最短路对应着区间 [l+1,r][l+1,r] 的最小代价区间划分。

一些性质
  • f(x,y,k)f(x,y,k)xyx\to y 的经过 kk 条边的的蒙日矩阵最短路的长度,则 f(x,y,k)f(x,y,k) 关于 kk 是凸的;

    考虑证 f(x,y,k)f(x,y,k1)f(x,y,k+1)f(x,y,k)f(x,y,k)-f(x,y,k-1)\le f(x,y,k+1)-f(x,y,k) 相当于证 2f(x,y,k)f(x,y,k1)+f(x,y,k+1)2f(x,y,k)\le f(x,y,k-1)+f(x,y,k+1)

    f(x,y,k1)f(x,y,k-1)f(x,y,k+1)f(x,y,k+1) 对应的最短路径拿出来,考虑根据这两条路径构造两条长度为 kk 的路径使得它们的和不变大。按照编号若某个点来自 k1k-1 则写下 a\text{a},否则写下 b\text b,编号相同的顺序任意,得到序列 p[1,2k]p_{[1,2k]},那么 a\text a 一定比 b\text b 少两个。

    考虑找到某个前缀 p[1,i]p_{[1,i]} 满足 a\text ab\text b 恰好少一个,且 pi=pi+1=bp_i=p_{i+1}=\text b

    则此时 p[i+1,2k]p_{[i+1,2k]} 一定也满足 a\text ab\text b 恰好少一个,那么可以这样构造两条长 kk 的路径:

    • p[1,i]p_{[1,i]} 中的 a\text a 接上 p[i+1,2k]p_{[i+1,2k]} 中的 b\text b
    • p[1,i]p_{[1,i]} 中的 b\text b 接上 p[i+1,2k]p_{[i+1,2k]} 中的 a\text a

    注意到由于 pi=pi+1=bp_i=p_{i+1}=\text b,所以中间部分实际上是将一个包含变为了相交,故路径代价总和不增。

    故证明一定能找到这样的 ii 即可。

    考虑折线图,将 a\text a 看作 11b\text b 看作 1-1,则该折线从 00 出发,在 2-2 处终止。由于折线是连续的,故一定有某个时刻位于 1-1,此时若下一个时刻位于 00,则后半部分递归了,否则就找到了连续的两个 b\text b