嗯......四边形不等式的确长得像个四边形【雾】

我们在dp中,经常见到这样一类状态以及转移方程:

设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\right]$中的最小值/最大值/和值

然后有这样的转移:

$dp\left[i\right]\left[j\right]=min\left(dp\left[i\right]\left[k-1\right]+dp\left[k\right]\left[j\right]+w\left(i,j\right)\right)$,其中$i<k\leqslant j$

$w\left(i,j\right)$表示闭区间$\left[i,j\right]$通过一定方法计算出来的费用

这个dp的复杂度显然是$O\left(n^3\right)$的,因为是平方的状态、线性的转移

但是有的时候这样的复杂度并不够切掉题目,这时我们需要一些优化

那么在这种情况下,四边形不等式就可以发挥它的价值了

首先,定义区间单调性如下:

当$p_1\leqslant p_2\leqslant p_3\leqslant p_4$时,若$w\left(p_2,p_3\right)\leqslant w\left(p_1,p_4\right)$,则称$w$满足区间单调性

同时定义四边形不等式如下:

当$p_1\leqslant p_2\leqslant p_3\leqslant p_4$时,若$w$满足如下式子,则称$w$满足四边形不等式:

$w\left(p_1,p_3\right)+w\left(p_2,p_4\right)\leqslant w\left(p_2,p_3\right)+w\left(p_1,p_4\right)$

接下来是一条非常重要的定理:

如果$w$函数满足四边形不等式,那么$dp$函数也满足四边形不等式!

也就是说:

当$p_1\leqslant p_2\leqslant p_3\leqslant p_4$时

$dp\left(p_1,p_3\right)+dp\left(p_2,p_4\right)\leqslant dp\left(p_2,p_3\right)+dp\left(p_1,p_4\right)$

而且还有另一个定理:

如果$dp$函数满足四边形不等式,那么表示$dp$函数取得最优值的点(也就是k)的那个函数$s$在每一行和每一列上单调

这个有点绕,换种说法

设$s\left[i\right]\left[j\right]$表示当$dp\left[i\right]\left[j\right]=min\left(dp\left[i\right]\left[k-1\right]+dp\left[k\right]\left[j\right]+w\left(i,j\right)\right)$的时候

$dp\left[i\right]\left[j\right]$取到最优(比如最大最小)值的时候,$k$的值,

$s\left[i\right]\left[j\right] \leqslant s\left[i\right]\left[j+1\right]$

那么$s$函数满足:

$s\left[i\right]\left[j\right] \leqslant s\left[i\right]\left[j+1\right]$

$s\left[i\right]\left[j\right] \leqslant s\left[i\right]\left[j+1\right]$,同时$s\left[i\right]\left[j\right] \leqslant s\left[i-1\right]\left[j\right]$

也就是说在枚举$k$值的时候,我们的闭区间变成了$\left[s\left[i\right]\left[j-1\right],s\left[i+1\right]\left[j\right]\right]$

因此只要先枚举区间长度,再枚举$i$求出$j$,就可以利用这个优化了

这个优化用完了以后,总复杂度可以从$O\left(n^3\right)$变成$O\left(n^2\right)$的

美滋滋

为了加深理解,我们来看一道例题:石子归并

这就是区间dp中四边形不等式的最基础的优化了

还有一道类似题目:Tree Construction

经典的四边形不等式优化,到这里就结束了(因为本来就是个比较窄的优化)

但是真的止于此地么?

我们看一道例题:HDU3480

可以说是比较显然的dp了,这里放上题解供参考:题解

看完题解会发现,这道题竟然也可以用四边形不等式优化!

为什么呢?

我们发现,这道题里面的$w$依旧满足区间单调性以及四边形不等式

证明一下(这里证明过程其实不需要掌握了)可以发现$dp$也满足四边形不等式

也就是说,我们只要找到$s$函数的依赖方式就能用四边形不等式优化了!

这道题中,实际上$s$依旧满足上述的行列单调递增,但是这里不能再使用闭区间$\left[s\left[i\right]\left[j-1\right],s\left[i+1\right]\left[j\right]\right]$了

因为方程式中只有一项$dp$,所以这两个$s$中的后面那一个和全方程无关,甚至可能还没有完全推出来

因此我们更改一下枚举方式,变成闭区间$\left[s\left[i-1\right]\left[j\right],s\left[i\right]\left[j+1\right]\right]$

这样就解决了问题

需要注意的是,枚举$len$再枚举$i$的方式现在不行了,我们需要枚举$i$再倒序枚举$j$,因为$\left[i,j\right]$依赖$\left[i,j+1\right]$

这道例题其实也可以用区间枚举法过掉(利用了另外的一个想法),但是不是所有这类”前j个元素放i个挡板“的dp都可以这么优化的,所以还是取上面讲的新方法比较好

另外的两道例题:POJ1160 HDU2829

省选算法学习-dp优化-四边形不等式的更多相关文章

  1. dp优化-四边形不等式(模板题:合并石子)

    学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...

  2. dp优化---四边形不等式与决策单调性

    四边形不等式 定理1: 设w(x,y)为定义在整数集合上的二元函数,若存在任意整数a,b,c,d(a<=b<=c<=d),并且w(a,d)+w(b,c)>=w(a,c)+w(b ...

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

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

  4. 区间dp之四边形不等式优化详解及证明

    看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...

  5. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  6. 学习笔记:四边形不等式优化 DP

    定义 & 等价形式 四边形不等式是定义在整数集上的二元函数 \(w(x, y)\). 定义:对于任意 \(a \le b \le c \le d\),满足交叉小于等于包含(即 \(w(a, c ...

  7. 区间DP的四边形不等式优化

    今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:

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

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

  9. 『一维线性dp的四边形不等式优化』

    四边形不等式 定义:设\(w(x,y)\)是定义在整数集合上的的二元函数,若对于定义域上的任意整数\(a,b,c,d\),在满足\(a\leq b\leq c \leq d\)时,都有\(w(a,d) ...

随机推荐

  1. js数据结构处理--------树结构数据遍历

    1.深度遍历 深度遍历利用栈来实现 class Stack { constructor () { this.top = 0, // 栈的长度 this.list = [] } push(item) { ...

  2. Bootstrap HTML编码规范

    语法 1.用两个空格来代替制表符(Tab)--这是唯一能保证在所有的环境下获得一致展现的方法. 2.嵌套元素应当缩进一次(即两个空格). 3.对于属性的定义,属性值确保全部都用双引(避免使用单引号). ...

  3. C#的接口基础教程之六 接口转换

    C#中不仅支持.Net 平台,而且支持COM平台.为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性.一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息.属性使 C# 能够支 ...

  4. GPT分区表的备份与恢复

    GPT分区表的备份与恢复  keenshoes 2016-01-13 21:02:25 关键词: GPT, Partition, MBR,APPLE, GUID, Protective MBR 对于现 ...

  5. mysql优化之explain各参数详解:

    explain简介 explain命令可以获取Mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序.当我们想知道这个表操作是索引查询还是全表扫描时,我们就可 ...

  6. ES6箭头函数基本用法

    ES6箭头函数基本用法 ``` window.onload = function(){ alert(abc); } //箭头函数 window.onload = ()=>{ alert(&quo ...

  7. ATM-interface-user

    from db import db_handlerfrom lib import common user_logger = common.get_logger('user') def login_in ...

  8. 3D全景漫游

    全景图共分为三种: ①球面全景图 利用一张全景图围成一个球,自身位置位于球体内.由于图片是矩形,所以最上和最下的缝合处很明显就能够看得出来. 球面全景图是最接近人眼的构建模式,若利用多个立面构建,拼接 ...

  9. stm32的systick原理与应用

    /* SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟.无论用作延时还 ...

  10. Special Segments of Permutation - CodeForces - 1156E (笛卡尔树上的启发式合并)

    题意 给定一个全排列\(a\). 定义子区间\([l,r]\),当且仅当\(a_l + a_r = Max[l,r]\). 求\(a\)序列中子区间的个数. 题解 笛卡尔树上的启发式合并. \(200 ...