决策单调性
一些定义:
- 四边形不等式:
若函数 \(f\) 对于任意 \(1 \le i \le i' \le j' \le j\),都有 \(f(i', j) + f(i, j') \le f(i,j) + f(i', j')\),则称 \(f\) 满足四边形不等式。
(可以看成是四边形的两条对边和对角线的关系,可以简记为 "交叉小于包含"。)
性质 1.1:
对于任意 \(1 \le i \le j\),满足 \(f(i,j) + f(i + 1, j + 1) \le f(i,j + 1) + f(i + 1, j)\) 是 \(f\) 满足四边形不等式的充要条件。
证明: 必要性是显然的。我们将 \(f(i, j) + f(i + 1, j + 1) \le f(i + 1, j) + f(i, j + 1)\)
\(f(i + 1, j + 2) + f(i, j + 1) \le f(i + 1, j + 1) + f(i, j + 2)\)
两边分别相加起来,即可达到一个拓展的效果。反复地做充分性即可得证。
- 区间包含单调性:
若有函数 \(f\),对于任意 \(1 \le i \le i' \le j' \le j\),都有 \(f(l, r) \le f(l', r')\), 则称 \(f\) 满足区间包含单调性。
- 决策单调性:
在最优化 \(dp\) 中,我们称使某个状态取到最优值的决策称为最优化决策。若这个最优化决策随着转移顺序的推进,随着一个方向单调递增或递减的移动,我们称这个 \(dp\) 具有决策单调性。
常见判定性质:
性质 2.1:
若 \(f, g\) 函数均满足决策单调性(或区间包含单调性),则对于 \(a, b > 0\),\(af + bg\) 也满足决策单调性(或区间包含单调性)。
这一点容易证明。
性质 2.2:
若函数 \(f(l , r) = g(r) - h(l)\),则 \(f\) 满足四边形不等式,若 \(g,h\) 有单调性,则 \(f\) 满足区间包含单调性。
证明: 使用性质 1.1 可以发现两边事实上是相等的。
性质 2.3:
若函数 \(f\) 是单调递增的下凸函数,\(w\) 满足四边形不等式,则 \(f(w(l,r)) 也满足四边形不等式。\)
证明:
我们令 \(w_1 = w(l, r), w_2 = w(l, r + 1), w_3 = w(l + 1, r), w_4 = w(l + 1, r + 1)\)。考虑证明:\(f(w_2) + f(w_3) \le f(w_1) + f(w_4)\)。
我们现在有 \(w_2 + w_3 \le w_1 + w_4\),注意到 \(w_1, w_4\) 中一定有一个大于等于 \(w_2, w_3\) 的其中一个。不妨设 \(w_4 \ge w_2\)。
对待证式和关于 \(w\) 的四边形不等式分别做一个变形:
\(w_2 - w_1 \le w_4 - w_3\)
\(f(w_2) - f(w_1) \le f(w4) - f(w3)\)
注意到 \(f\) 的性质:对于式子 \(f(x) - f(x - \delta)\):
-
\(delta\) 不变时,\(x\) 越大时,该式值越大。
-
\(x\) 不变时,\(delta\) 越大,该式值越大。
观察待证式发现,等式右边相对于等式左边满足两个条件,从而 \(f(w(l, r))\) 满足四边形不等式。
经典优化套路
(以下我们认为 \(w\) 函数可在 \(O(1)\) 时间内求出)
1D:
离线决策:
形式: \(f_i = \min _{j < i}g_{j - 1} + w(i, j)\)
性质:此时假如 \(w\) 函数满足四边形不等式,则 \(f\) 满足决策单调性。
证明:
考虑反证法,记 \(p_i, p_j\) 分别为 \(f_i, f_j\) 的最优决策,若 \(i, j\) 是不满足决策单调性的反例(即 \(p_i \le p_j \le j \le i\)),则我们有:
\(f_{p_i} + w(p_i + 1, i) \le f_{p_j} + w(p_j + 1, i)\)
\(f_{p_j} + w(p_j + 1, j) \le f_{p_i} + w(p_i + 1, j)\)
将两式左右分别相加,整理后发现与 \(w\) 满足四边形不等式的性质矛盾。
优化方式:分治
我们考虑递归解决该问题:
\(solve(l, r, lk, rk)\):表示要计算 \([l,r]\) 中所有 \(f\) 值,并且该区间内的所有点的最优决策点都在 \([lk, rk]\) 这个区间中。
我们先考虑计算 \([l,r]\) 的中点 \(mid\) 的 \(f\) 值。直接暴力遍历 \([lk, rk]\) 即可。同时求出 \(mid\) 的最优决策点 \(pos\)。那么由决策单调性, \([l, mid - 1]\) 中的点的最优决策点一定在 \([lk, pos]\) 中。同理 \([mid + 1, r]\) 中的点的最优决策点在 \([pos, rk]\) 中。于是我们递归 \(solve(l, mid - 1, lk, pos)\) 和 \(solve(mid + 1, r, pos, rk)\)。
不难发现该算法的递归层数为 \(O(\log n)\),每层中的每个遍历区域都是紧密排列的,从而该算法的时间复杂度为 \(O(n \log n)\)。
在线决策:
形式: \(f_i = \min _{j < i} f_{j - 1} + w(i, j)\)
性质: 若 \(w\) 函数满足四边形不等式,则 \(f\) 满足决策单调性。
证明: 同上。
优化方式:二分队列
此时发现分治的做法不管用了,因为我们不能先决策 \(mid\)。
我们令 \(P_i\) 是 \(f_i\) 的最优决策位置。考虑一个个遍历每个决策位置并维护 \(P\) 数组。
容易观察到 \(P\) 的形态会变成紧密排列的相等值段。于是我们用一个队列维护三元组 \((id, l, r)\),其中 \(id\) 是决策位置,且 \(P_i = id(l \le i \le r)\).
当我们加入一个决策 \((id, l, r)\) 时,我们这样操作:
\(1\). 取出队头 \((id_h, l_h, r_h)\),若 \(r_h < id\) 则弹出队头,令 \(P_{i} = id_h (l_h \le i \le r_h)\),并重复执行 \(1\),否则来到 \(2\)。
\(2\). 取出队尾 \((id_t, l_t, r_t)\):
-
\((a).\) 若 \(id\) 对于 \(f_{l_t}\) 比 \(id_t\) 更优,弹出队尾,重复执行 \(2(a).\)
-
\((b).\) 若 \(id\) 对于 \(f_{r_t}\) 比 \(id_t\) 更劣,我们令 \(l = r_t + 1, r = n\),执行 \(3\).
-
\((c).\) 若不满足 \(2(a).\) 和 \(2(b).\),在区间 \([l_t, r_t]\) 二分找出最小的 \(pos\),使得 \(id\) 对于 \(f_{pos}\) 比 \(id_t\) 更优,并令 \(r_t = pos - 1\),\(l = pos\),\(r = n\)。执行 \(3\).
\(3\). 加入决策 \((id, l, r)\)。
2D:
分层决策:
形式: \(f_{i , k} = \min_{j < i} {f_{j - 1,k - 1} + w(i, j)}\)
优化方法: 我们令 \(g_i = f_{i, k - 1}\),按 \(\rm 1D\) 方式转移即可。
合并决策:
形式: \(f_{i,j} = \min_{i \le k < j} {f(i, k) + f(k + 1, j) + w(i, j)}\)(特殊的,令 \(f_{i,i} = 0\))
性质:
\((1)\):
结论: 若 \(w\) 满足四边形不等式,则 \(f\) 也满足四边形不等式。
证明: 发现转移顺序是按区间长度从小到大的,于是我们尝试使用数学归纳法证明。
加入我们已经证明了区间长度小于等于 \(len - 1\) 的情况,显然 \(len = 1\) 时成立。证明 \(len\) 的情况很容易由性质 \(2.1\) 推出。
\((2)\):
结论: 记 \(pos_{i, j}\) 是 \(f\) 的最优决策。若 \(w\) 满足四边形不等式,则有 \(pos_{i - 1, j} \le pos_{i, j} \le pos_{i, j + 1}\)。
证明: 我们考虑反证法,若有一对 \((i, j)\) 的最优决策 \(pos_{i, j} > pos_{i + 1, j}\),同时我们令 \(s_1 = pos_{i, j}, s_2 = pos_{i + 1, j}\)。其中 \(i \le s_2 < s_1 < j\)
由条件我们有:
\(f_{i, s_1} + f_{s_1 + 1, j} \le f_{i, s_2} + f_{s_2 + 1, j}\)
\(f_{i + 1, s_2} + f_{s_2 + 1, j} \le f_{i + 1, s_1} + f_{s_1 + 1, j}\)
两式左右分别相加可知:
\(f_{i, s_1} + f_{i + 1, s_2} \le f_{i + 1, s_1} + f_{i, s_2}\)
注意到 \(f\) 是满足四边形不等式的,于是就导出了矛盾。
优化方式:
通过上面的性质 \((2)\),我们可以让 \(k\) 只遍历区间 \([pos_{i - 1, j}, pos_{i, j + 1}]\)。此时的转移均摊下来就是 \(O(1)\) 的了。可以把时间复杂度从 \(O(n^3)\) 优化到 \(O(n ^ 2)\)。