四边形不等式优化(决策单调性 DP)

四边形不等式优化(决策单调性 DP)

四边形不等式

对于定义域为整数的二元函数 \(w(i,j)\),如果对于 \(a\le b\le c\le d\),满足 \(w(a,c)+w(b,d)\le w(a,d)+w(b,c)\)(即交叉小于等于包含),则称 \(w(i,j)\) 满足四边形不等式。

还是上面的函数,如果对于 \(a+1<b\),满足 \(w(a,b)+w(a+1,b+1)\le w(a,b+1)+w(a+1,b)\)\(w\) 也满足四边形不等式,可感性理解。

我们用下面这条式子可以更方便的证明某个函数是否满足四边形不等式,当然很多时候我们可以通过打表得出。

决策单调性

最优决策点:我们对于 \(i\),有一个最优的位置 \(j\) 使得 \(f(i)\) 最优,\(j\) 就叫做 \(i\) 的最优决策点,记作 \(opt(i)\),也可能是多个。

决策单调性:对于 \(i<j\),有 \(opt(i)\le opt(j)\)

我们看下面几条 DP 式:

\[f(i)=\min_{0\le j< i} w(j+1,i) \]

\[f(i)=\min_{0\le j<i}f(j)+w(j+1,i) \]

\[f(i,k)=\min_{0\le j<i}f(j,k-1)+w(j+1,i) \]

其中,一式是不依赖于之前的 \(f\) 的 DP。

二式是依赖于之前的 \(f\) 的 DP,其可看做一个区间分割问题,\(w\) 是一个区间的代价,同时不限分割个数。

三式是限制分割个数的区间分割问题。

我们可以经过证明得到,当 \(w(i,j)\) 满足四边形不等式时,上述 DP 式一定满足决策单调性(注意 DP 式中一定是 \(\min\))。

\(w(i,j)\) 满足四边形不等式是他们有决策单调性的充分不必要条件。

求解决策单调性

我们将介绍两种方法,为分治法和使用二分队列。

分治法

对于上文中的一式,由于对于每个位置,它不依赖于其他位置的值,所以可以不按顺序地求任意一个位置的最优决策点,于是考虑分治。

\(solve(l,r,L,R)\) 表示求 \([l,r]\) 位置的最优决策点,并且已知它们的最优决策点都在 \([L,R]\) 范围内。

于是考虑先求出 \(mid=\lfloor\frac{l+r}{2}\rfloor\) 的最优决策点,我们直接遍历 \([L,R]\) 求它的决策点。

\(opt(mid)=d\),于是分治求解 \(solve(l,mid-1,L,d),solve(mid+1,r,d,R)\)

例题:P3515 [POI2011] Lightning Conductor

对于三式,我们也可以选择用分治,但复杂度可能不优。

具体来说,设最后要分 \(m\) 个区间,则考虑枚举当前这一层选的区间个数,我们一层一层考虑,这样 \(f\) 就不依赖于这一层的 \(f\) 了,而依赖于上一层的 \(f\),此时复杂度为 \(O(mn \log n)\)

例题:P4767 [IOI2000] 邮局 加强版

二分队列

对于上文中的二式和三式,就不可分治了,于是用二分队列。

对于一个位置 \(i\),它作为 \(j\) 的最优决策点 \(opt(j)=i\) ,满足的 \(j\) 一定形成一个区间 \([l,r]\)

于是我们从前往后扫到 \(i\),通过我们队列里的最优决策点得到 \(f(i)\),然后求得 \(i\) 对应的区间 \([l,r]\),把三元组 \((i,l,r)\) 压进队列里。

我们队列里的三元组从前往后要满足对于 \(i<j\) 的位置,一定有 \(r_i<l_j\)

具体来说:

首先初始化队列中只有一个元素 \((0,1,n)\),初始化 \(f(0)\)

然后从前往后扫,扫到了 \(i\)(设 \(h\) 为头,\(t\) 为尾)。

  1. 一直把满足 \(r_h<i\) 的队头弹掉。

  2. 此时 \(l_h\le i\le r_h\),则此时的 \(i_h\) 就是 \(i\) 的最优决策点,于是计算 \(f(i)\)

  3. 把可能得 \(r_h\le i\) 的队头弹掉,因为这一部分已经没有用了,方便后续操作。

  4. 一直把满足 \(f(i)+w(i+1,l_t)<f(i_t+1,l_t)\) 的队尾弹掉,注意弹掉前要判断是否 \(l_t\ge i+1\)

  5. 看队列是否已空。

    5.1. 空,则插入 \((i,i+1,n)\)

    5.2. 非空,则考虑在 \([\max(i+1,l_t),r_t]\) 二分一个最小的位置 \(j\) 使得 \(f(i)+w(i+1,j)<f(i_t)+w(i_t+1,j)\)

    若存在这样的 \(j\),说明对于 \([j,r_t]\) 来说,\(i_t\) 没有 \(i\) 优,于是将 \(r_t\) 改为 \(j-1\),同时插入 \((i,j,n)\)

    若不存在这样的 \(j\),说明 \([l_t,r_t]\) 这段区间内,\(i\) 都没有 \(i_t\) 优,所以判断是否满足 \(r_t<n\),是则插入 \((i,r_t+1,n)\)

在这里,我们判断是否更优使用了 \(<\),这样可以使决策点尽可能靠前,对于限定区间个数时,这样就会使选的区间个数尽可能少,方便用后续的 wqs 二分优化。而如果我们用 \(\le\),可以使选的区间个数尽可能多。

配合 wqs 二分解决限制区间个数的情形

如上面的三式,便可以考虑用 wqs 二分去掉要求选择个数 \(m\) 的限制。

此时如上所说,二分队列中符号的选择很重要。

例题:邮局 加强版 加强版

例题:abc355g baseball

Knuth 优化解决区间合并问题

可以在 \(O(n^2)\) 内解决如下任一问题(以下 \(1\le i \le j\le n\)):

\[f(i,j)=\min _{i\le k \le j} f(i,k)+w(k,j) \]

\[f(i,j)=\min_{i\le k<j}f(i,k)+f(k+1,j)+w(i,j) \]

要求代价函数 \(w\) 除了满足四边形不等式外,还要满足区间包含单调性,即对于任意 \(a\le b\le c\le d\) 有:

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

若满足性质,我们记 \(opt(i,j)\)\(f(i,j)\) 的最优决策点,则有性质:

\[opt(i,j-1)\le opt(i,j) \le opt(i+1,j) \]

则可以用以下算法做到 \(O(n^2)\) 求出所有 \(f(i,j)\)

  • 初始化 \(opt(i,i)=i\),初始化 \(f(i,i)\) 的值。
  • 依次对于 \(1\le len<n\) 的每个 \(len\),求 \(f(i,j=i+len)\),我们暴力枚举 \(opt(i,j-1)\le k \le opt(i+1,j)\),得到 \(f(i,j)\) 的最优决策点。

经过分析这样的复杂度是 \(O(n^2)\) 的。

例题:P8864 「KDOI-03」序列变换 - 洛谷

posted @ 2024-09-13 22:19  dengchengyu  阅读(50)  评论(0)    收藏  举报