Skip to content

决策单调性 笔记

一、基本概念

1. 一些术语

fi=min1j<i(fj+w(j+1,i))

  • 这是一个最小化问题 i
  • 它的决策集合是 {j1j<i}
  • 最优决策点 opt(i)=argmin1j<i(fj+w(j+1,i)),即取到最小值时 j 的位置。

2. 四边形不等式

abcd,满足:

w(a,c)+w(b,d)w(a,d)+w(b,c)

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

四边形不等式成立的一个充要条件:

a<b,w(a,b)+w(a+1,b+1)w(a,b+1)+w(b,a+1)

对于最大化问题,应将 变为

3. 区间单调性

abcd,满足:

w(a,d)w(b,c)

则称 w 满足区间单调性。

4. 决策单调性

设对于一个最大/最小化问题 i,它的最小可行解是 opt(i)

若对于 i1i2,满足:

opt(i1)opt(i2)

则称具有决策单调性。

二、常见形式

1. 1D

(1). 分治类问题

fi=min1jiw(j,i)

一般而言,w(j,i)O(1) 可求的。

定理一

w 满足四边形不等式,则 f 满足决策单调性。

证明:反证法。假设对于 a<bc<d,opt(c)=b,opt(d)=a,则根据定义 w(a,d)w(b,d)w(b,c)<w(a,c),移项可得 w(a,d)w(b,d)0<w(a,c)w(b,c),即 w(a,d)+w(b,c)<w(a,c)+w(b,d),与“w 满足四边形不等式”矛盾。故假设不成立,定理成立。

假设 l,r 是待处理区间的左边界,i 是当前正在处理的问题(i=l+r2),klkr 是可能出现答案的答案的左边界和右边界。

通过暴力枚举 klkr,求出 i 的最优决策 k,由于问题 w 具有决策单调性,所以,对于 [l,i1] 这一段区间,答案的范围是 [kl,k];对于 [i+1,r] 这一段区间,答案的范围是 [k,kr]。递归分治即可,时间复杂度为 O(nlogn)

cpp
void work(int l, int r, int kl, int kr) {
	if (l > r) return;
	int i = l + r >> 1, k = kl;
	for (int j = kl; j <= kr; j++)
		if (w(j, i) > w(k, i)) k = j;
	p[i] = max(p[i], w(k, i));
	work(l, i - 1, kl, k);
	work(i + 1, r, k, kr);
}

(2). 二分队列类问题

fi=min1j<i(fj+w(j+1,i))

需要用二分队列的四边形不等式优化,有一个鲜明的特征:i 的决策依赖于以前的决策

根据决策单调性,可以知道每一个决策一定都是一段连续区间问题的最优决策点。

因此,设 ltirti 表示 [lti,rti] 范围内的问题的决策是 i

一开始,一个问题都还没处理,lt0=1,rt0=n

定义一个单调队列,队列头表示问题 i 的最优决策。

开始处理第 i 个问题:

  1. fi=w(qfront,i),处理 fi

  2. 根据决策单调性,如果对于 ltqback 这个问题,当前的 i 决策还比以往的 qback 决策要优,那么 qback 决策不再可能成为最优决策,队尾可以弹出了。

  3. 将所有在第二步中“整个区间都被弹出”的决策清理掉后,此时队尾的决策对应的问题区间,它的右半部分很有可能也是决策 i 更优,因此二分在最后的这个问题区间,决策 i 更优的分界点是哪里,将分界点的左边的问题归给原本队尾的决策。

  4. 如果分界点还没有到达 n,那么就添加一个 i 决策最优的 [,n] 的问题区间。

  5. 最后,如果 qfront 这一个决策的问题区间右边界就是 i,那么这个决策后面就没用了,从队头弹出。

cpp
void work() {
    deque<int> q;
    q.push_back(0);
    lt[0] = 1, rt[0] = n;
    for (int i = 1; i <= n; i++) {
        f[i] = w(q.front(), i);
        while (i < lt[q.back()] and w(i, lt[q.back()]) < w(q.back(), lt[q.back()])) q.pop_back();
        int l = max(i, lt[q.back()] - 1), r = rt[q.back()] + 1;
        while (l + 1 < r) {
            int mid = l + r >> 1;
            if (w(i, mid) < w(q.back(), mid)) r = mid;
            else l = mid;
        }
        rt[q.back()] = r - 1;
        if (r <= n) {
            q.push_back(i);
            lt[i] = r, rt[i] = n;
        }
        while (i == rt[q.front()]) q.pop_front();
    }
}

2. 2D

(1). 区间分拆问题

fi,j=min1k<j(fi1,k+w(k+1,j))

gj=fi1,j,变为 1D 问题。

(2). 区间合并问题

石子合并问题。

fi,j=minik<j(fi,k+fk+1,j+w(i,j))

定理二

w 满足四边形不等式,则 f 满足决策单调性。

证明:当 i=j 时,定理成立。当 i+1=j 时,原式相当于对若干个四边形不等式求和再取最小值,仍满足四边形不等式。以此类推,可以得到 fi,j 满足四边形不等式和决策单调性。

定理三

opt(i1,j)opt(i,j)opt(i,j+1)

证明:第二个小于等于号是 1D 情况。对于第一个小于等于号考虑反证法。设 x=opt(i1,j),y=opt(i,j),且 x>y。则有 iy<x<j。可以得到 fi1,x+fx+1,jfi1,y+fy+1,jfi,y+fy+1,jfi,x+fx+1,j。两式相加得 fi1,x+fi,yfi1,y+fi,x,与 f 是四边形不等式矛盾。故 x<y

三、刷题总结

真理(并非

事实上,考场上遇到了像是四边形不等式的题,我更愿意写个暴力判断是否满足,但是平时练习还是很需要证明的。

1. P3515 [POI2011] Lightning Conductor / SP9070 LIGHTIN - Lightning Conductor

求:

pi=maxj=1n{aj+|ij|}ai

先简单处理一下:

pi=max(maxj=1i{aj+ij},maxj=in{aj+ji})ai

只要处理出其中一个 max,另一个就可以用同样的方法解决。

w(j,i) 表示 aj+ij,则原式变为

pi=maxj=1iw(j,i)ai

这是一个最大化问题,接着证明 w 满足四边形不等式。

i<j,则

  • w(i,j)+w(i+1,j+1)=ai+ai+1+2ji
  • w(i,j+1)+w(i+1,j)=ai+ai+1+ji+1+ji1

x=ji1w 满足四边形不等式的充要条件是 2xx+1+x1

两边同时平方并移项,得 2x2x+1x1

再次两边同时平方,得 4x24x24,恒成立,故 w 满足四边形不等式。

分治求即可。

2. P3195 [HNOI2008] 玩具装箱

求:

fi=minj=1i{fj+(xL)2}

x=i(j+1)+k=jickc,L 已给出。

i 的决策依赖 i 以前的问题的决策,故使用二分队列法。

3. P4767 [IOI 2000] 邮局 加强版

2D 板子。

最近更新