定义 & 等价形式

四边形不等式是定义在整数集上的二元函数 \(w(x, y)\)。

定义:对于任意 \(a \le b \le c \le d\),满足交叉小于等于包含(即 \(w(a, c) + w(b, d) \le w(b, c) + w(a, d)\)。①

等价形式,对于任意的 \(a < b\),都有 \(w(a, b-1) + w(a+1,b) \le w(a+1, b-1)+w(a,b)\)。②


① 推 ② 看定义即可,② 推 ① 的证明:

任取 \(a < d\),\(w(a, d-1) + w(a+1,d \le w(a+1,d-1) + w(a,d)\)

若 \(a + 1 < d\),\(w(a+1, d-1) + w(a+2,d) \le w(a+2,d-1) + w(a+1,d)\)

两式相加:\(w(a+2,d) + w(a, d-1) \le w(a,d) + w(a+2,d-1)\)

可扩展到对于任意的 \(a \le a + k = b \le d\), \(w(b,d) + w(a, d-1) \le w(a,d) + w(b,d-1)\)

同理 \(c - 1\) 也可扩展到 \(c - k\),因此可扩展到 \(a \le b \le c \le d\) 的形式。


1D/1D 优化

形如: $f_i = \underset{0\le j<i}{\min}{{f_j+w(j, i)}} $。

若 \(w\) 满足四边形不等式:

① 则 \(f_i\) 具有最优决策单调性(即 \(p_i\) 表示 \(f_i\) 的最优决策 \(j\),则 \(p\) 非严格递增)。

② 且不仅最优决策有单调性,任意决策都有决策单调性(若 \(u < v\) 且在当前 \(i\) 时 \(v\) 优于 \(u\),则 \(i < i'\) 的 \(i'\) 时 \(u\) 也比 \(v\) 优)。


证明(证明了 ②,自然 ① 也成立):

任取 \(0 \le u < v < i < i'\),若有 \(f_u + w(u,i) \ge f_v + w(v, i)\) ③ 即在 \(i\) 时 \(v\) 比 \(u\) 优。

由四边形不等式 \(w(u, i) + w(v, i') \le w(v, i) + w(u, i') \Leftrightarrow w(u, i') - w(u, i) \ge w(v, i') - w(v, i)\)。④

③ 和 ④ 式相加得证。


因此,我们可以动态决策,维护就当前有的决策来说,每个位置的局部最优决策,加入前 \(i - 1\) 的决策后,当前 \(f_i\) 的决策就能得到,然后我们考虑加入 \(i\) 这个决策能作为哪些 \(f\) 的最优决策。由上述性质,\(i\) 影响的是一段后缀。因此我们要快速找出后缀的开头,可二分(后缀里 \(i\) 最优,后缀前 \(i\) 不优),但是我们如果暴力修改可能还是 \(O(n^2)\),因此我们可以把每个决策把其作为最优决策的区间一段一段的存。

具体做法:

  • 每个决策存 \(x, l, r\) 三个变量,分别代表决策、影响的区间左右端点。维护一个决策的队列。

  • 每次从队尾迭代:如果该区间队头都是 \(i\) 更优那么把这个决策删了;否则如果队尾 \(i\) 不优就退出;否则二分那个边界的位置。

复杂度:

  • 每个决策最多删除增加一次,插入删除是 \(O(n)\) 的。

  • 每次最多二分一次,这部分是 \(O(n \log n)\) 的。

因此总复杂度 \(O(n \log n)\)。

例题

NOI2009 诗人小G

设 \(l\) 为长度数组,\(S\) 为 \(l\) 前缀和。

朴素 DP 方程:\(f_i = \underset{0\le j < i}{\min} \{ f_j + |S_i - S_j + i - j - 1 - L| ^ P\}\)

证明 \(w(j, i) = |S_i - S_j + i - j - 1 - L| ^ P\) 满足决策单调性。

\(w(j+1,i) - w(j+1, i+1) \ge v(j,i) - v(j,i+1)\)。

设 \(v\) 是 \(w\) 那一坨去掉 \(P\) 次方。

设 \(a = v(j, i), b = v(j + 1, i)\)。

\(|b|^P - |b+l_{i+1}+1|^P \ge |a|^P - |a+l_{i+1} + 1|\)

即证明 \(y = |x|^P - |x+c|^P (c > 0)\) 函数非严格递减。

由于本人数学太差不会求导,只能感性证一下,首先看 \(P = 1\) 的情况,是以 \((-c/2, 0)\) 中心对称的一个函数,然后这个东西的物理意义就是到数轴上 \(x\) 到原点的距离 \(-\) 到 \((-c, 0)\) 的距离,分类讨论之后是递减的。如果有 \(P\) 次方是把这个影响扩大化,但是仍满足相对大小关系。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
typedef long double LD;
const int N = 100005;
int n, L, P, s[N], hh, tt, pre[N];
LD f[N];
char g[N][35];
struct Q{
int l, r, x;
} q[N];
/*
f[i] = f[j] + val(i, j)
val(i, j) = (s[i] - s[j] - (i - j - 1) - L) ^ P
*/
LD val(int i, int j) {
LD res = 1;
int x = abs(s[i] - s[j] + (i - j - 1) - L);
for (int k = 1; k <= P; k++) res *= x;
return res + f[j];
} void insert(int i) {
int pos = -1;
while (hh <= tt) {
if (val(q[tt].l, i) <= val(q[tt].l, q[tt].x)) pos = q[tt--].l;
else {
if (val(q[tt].r, i) < val(q[tt].r, q[tt].x)) {
int l = q[tt].l, r = q[tt].r;
while (l < r) {
int mid = (l + r) >> 1;
if (val(mid, i) <= val(mid, q[tt].x)) r = mid;
else l = mid + 1;
}
q[tt].r = r - 1, pos = r;
}
break;
}
}
if (pos != -1) q[++tt] = (Q) { pos, n, i };
} void print(int i) {
if (!i) return;
print(pre[i]);
for (int j = pre[i] + 1; j <= i; j++) {
printf("%s", g[j] + 1);
if (j != i) putchar(' ');
}
puts("");
} int main() {
int T; scanf("%d", &T);
while (T--) {
memset(pre, 0, sizeof pre);
scanf("%d%d%d", &n, &L, &P);
for (int i = 1; i <= n; i++) {
scanf("%s", g[i] + 1);
s[i] = s[i - 1] + strlen(g[i] + 1);
}
hh = tt = 1;
q[1] = (Q) { 1, n, 0 };
for (int i = 1; i <= n; i++) {
int j = q[hh].x;
f[i] = val(i, j);
pre[i] = j;
while (hh <= tt && q[hh].r <= i) hh++;
q[hh].l = i + 1;
insert(i);
}
if (f[n] > 1e18) puts("Too hard to arrange");
else printf("%lld\n", (LL) f[n]), print(n);
puts("--------------------");
}
}

2D/1D 优化

定理 1:

① 形如 \(f_{i, j} = \underset{i\le k < j}{\min}\{ f_{i, k} + f_{k+1, j} + w(i, j) \}\),② 且 \(f_{i, i} = w_{i,i} = 0\)。

③ 若 \(w\) 满足四边形不等式,④ 而且对于任意的 \(a \le b \le c \le d\) 都有 \(w(a,d) \ge w(b,c)\)

若有着四个条件,则 \(f\) 也满足四边形不等式。


证明:

当 \(j - i = 1\) 时,\(f_{i,j+1}+f_{i+1,j}=f_{i,i+2}\)

若 \(f_{i,i+2}\) 最优决策是 \(i\):

\[f_{i,i+2}=f_{i+1,i+2}+w(i,i+2) \\ =w(i+1,i+2)+w(i,i+2) \\ \ge w(i+1,i+2)+w(i,i+1) \\ \ge f_{i+1,i+2}+f_{i,i+1}=f_{i,j+1}+f_{i,j}
\]

最优决策是 \(i+1\) 同理。

因此这时候满足四边形不等式。

接着数学归纳法,设 \(j - i < k\) 时 \(f\) 的四边形不等式成立(这里 \(i, j\) 分别作为最小数和次大数),尝试证 \(j - i = k\) 成立。

然后是一大波分讨。

如果 \(i + 1 \le x \le y\)。

设 \(f_{i,j+1}\) 和 $f_{i+1,j} $ 的最优决策分别是 \(x\) 、 \(y\)。

\(f_{i,j+1}+f_{i+1,j} = f_{i, x} + f_{x+1,j+1}+w(i,j+1) + f_{i+1,y}+f_{y+1,j}+w(i+1,j)\) ①

\(f_{i,j}+f_{i+1,j+1} \le f_{i,x}+f_{x+1,j}+w(i,j)+f_{i+1,y}+f_{y+1,j+1}+w(i+1,j+1) ②\) ②

根据前面的四边形不等式有:

\(w(i, j) + w(i+1,j+1) \le w(i,j+1) + w(i+1, j)\)

\(f_{x+1,j}+f_{y+1,j+1}\le f_{x+1,j+1}+f_{y+1,j}\),这里因为 \(j - (x + 1) < j - i = k\) 所以成立。

所以 ① ② 可以用不等号连起来,就有了 \(f_{i,j}+f_{i+1,j+1}\le f_{i,j+1}+f_{i+1,j}\),就证完了。

如果 \(i + 1 \le y \le x\)。

与上述证明类似。


定理 2

若上述那个式子的 \(f\) 满足四边形不等式,设 \(p_{i, j}\) 为 \(f_{i,j}\) 的最优决策。

则有:$$p_{i,j-1} \le p_{i,j} \le p_{i+1,j}$$

设 \(p = p_{i,j}, i < k \le p\),有 \(f_{i,p} + f_{i+1,k} \ge f_{i+1,k} + f_{i+1,p} \Leftrightarrow f_{i+1,k} - f_{i+1,p} \ge f_{i,k} - f_{i,p}\)

\(p\) 的最优性有 \(f_{i,k}+f_{k+1,j} \ge f_{i,p}+f_{p+1,j}\)。

\[f_{i+1,k}+f_{k+1,j}+w(i+1,j) - (f_{i+1,p} + f_{p+1,j} + w(i+1,j)) \\ \ge (f_{i,k} - f_{i,p}) + (f_{k+1,j} - f_{p+1,j}) = (f_{i,k}+f_{k+1},j) - (f_{i,p}+f_{p+1,j}) \\ \ge 0
\]

因此对于 \(f_{i+1,j}\),选 \(p\) 比所有的 \(k < p\) 都优,因此 \(p_{i,j} \le p_{i+1,j}\)。

\(p_{i,j-1} \le p_{i,j}\) 同理。


因此我们每次循环决策可以就询问 \([p_{i,j-1}, p_{i+1,j}]\),这样是 \(O(n^2)\) 的。

复杂度证明,枚举 \(f_{i,j}\) 的最优决策复杂度是 \(p_{i+1,j} - p_{i,j-1}\) 量级的。把所有的求和,发现每个 \(p_{l, r}\) 除非某一位是 \(n\) 或 \(1\),否则会分别有一正一负的抵消贡献,剩下的是部分最多 \(2n\) 项每一项都是 \(\le n\)(甚至还有负的,所以总共 \(O(n^2)\)。

例题 石子合并

\(n = 5000\) 的石子合并。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int N = 5005; int n, f[N][N], p[N][N], s[N]; int main() {
memset(f, 0x3f, sizeof f);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", s + i), s[i] += s[i - 1];
f[i][i] = 0, p[i][i] = i;
}
for (int l = 2; l <= n; l++) {
for (int i = 1, j; (j = i + l - 1) <= n; i++) {
for (int k = p[i][j - 1]; k <= p[i + 1][j]; k++) {
if (f[i][k] + f[k + 1][j] + s[j] - s[i - 1] < f[i][j]) {
f[i][j] = f[i][k] + f[k + 1][j] + s[j] - s[i - 1], p[i][j] = k; }
}
}
}
printf("%d\n", f[1][n]);
}

学习笔记:四边形不等式优化 DP的更多相关文章

  1. [学习笔记]四边形不等式优化DP

    形如$f[i][j]=min{f[i][k]+f[k+1][j]}+w[i][j]$的方程中, $w[\;][\;]$如果同时满足: ①四边形不等式:$w[a][c]+w[b][d]\;\leq\;w ...

  2. hdu 2829 Lawrence(四边形不等式优化dp)

    T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...

  3. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  4. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  5. codevs3002石子归并3(四边形不等式优化dp)

    3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm  时间限制: 1 s  空间限制: 256000 KB  题目等级 ...

  6. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  7. 四边形不等式优化DP——石子合并问题 学习笔记

    好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...

  8. HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

    题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...

  9. POJ 1160 四边形不等式优化DP Post Office

    d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...

随机推荐

  1. shell编程之俄罗斯方块

    按键获取: 向上  ^[[A 向下  ^[[B 向左  ^[[D 向右  ^[[C 其中  ^[为ESC键. 按键获取的具体shell代码如下所示: #! /bin/bash GetKey() { a ...

  2. HotSpot源码分析之C++对象的内存布局

    HotSpot采用了OOP-Klass模型来描述Java类和对象.OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型.为了更好理解这个模型, ...

  3. 03、MyBatis 映射文件

    1.XML映射器 2.select Select元素来定义查询操作 Id:唯一标识符 - 用来引用这条语句,需要和接口的方法名一致 parameterType:参数类型 - 可以不传,MyBatis会 ...

  4. JWT 实战

    上一篇我们讲解了 JWT 的基本原理和结构 你了解JWT吗?,接下来我们具体实战一下! 1. 引入依赖 <!--引入jwt--> <dependency> <groupI ...

  5. 最全JVM与性能调优知识点总结,看看哪些是你还没掌握的?

    前言 JVM调优是每个高级程序员的必修课,在本章中,我会从发展过程以及核心价值来剖析JVM的体系结构.为了让大家更好的理解JVM的工作机制, 我会在讲解完运行时数据区之后,再通过一个类的加载过程到这个 ...

  6. 两款超好用的Mac读写ntfs软件推荐给大家

    活中我们免不了会使用一些硬盘设备来存储文件或者是数据,然而绝大多数的移动硬盘都是ntfs格式.Mac读写ntfs软件有很多,究竟哪一款适合我们? 首先,我们一起了解一下什么是ntfs格式.ntfs,是 ...

  7. 教您使用OCR编辑器复制文档内容

    ABBYY FineReader 15允许用户复制图像或者扫描页面上的内容,可复制其中的文本.图片和表格的信息.在复制过程中,用户无需将图像或扫描页面转换为可编辑的格式,可以直接在ABBYY Fine ...

  8. H5系列之常用的语义元素

    H5添加了几个新标签,带有语义化的标签,像我们的div 和 span 标签,你说他两能干嘛呢, 好像他两什么事都能干.举个例子,你家里的房子,有几个房间,如果不分房间的话,是不是你 今天睡这里,明天睡 ...

  9. sql常用函数整理

    SQL中包含以下七种类型的函数: 聚合函数:返回汇总值. 转型函数:将一种数据类型转换为另外一种. 日期函数:处理日期和时间. 数学函数:执行算术运算. 字符串函数:对字符串.二进制数据或表达式执行操 ...

  10. mysql常用语句列表

    增 增加一张表 CREATE TABLE `table_name`( ... )ENGINE=InnoDB DEFAULT CHARSET=utf8; 增加记录 INSERT INTO `your_t ...