四边形不等式

定理1:

  设w(x,y)为定义在整数集合上的二元函数,若存在任意整数a,b,c,d(a<=b<=c<=d),并且w(a,d)+w(b,c)>=w(a,c)+w(b,d)都成立,则w(x,y)满足四边形不等式。

定理2:

  设w(x,y)为定义在整数集合上的二元函数,若存在任意整数a,b(a<b),并且w(a,b+1)+w(a+1,b)>=w(a,b)+w(a+1,b+1)都成立,则w(x,y)也满足四边形不等式。

用数学归纳法证明即可。

决策单调性

  假设转移方程为dp[i]=min(dp[j]+v(j,i)),v(j,i)为状态j到状态i的转移代价。设p[i]为转移到i状态最优的j,如果p[i]在定义域上单调不下降则称转移方程具有决策单调性。

定理:

  若在上述转移方程中v(j,i)满足四边形不等式,则转移方程满足决策单调性。

证明:

  

  观察式③可以发现,当j<p[i]时,以p[i]作为dp[i`]的决策比j要好,那么以此可以得出p[i`]>=p[i],既转移方程满足决策单调性。

应用

  如何通过决策单调性将o(n^2)的复杂度降到o(nlogn)呢?

  关键在于如何维护p数组,首先再回顾一下p数组的意义:p[i]是dp[i]的最优决策,既dp[i]=dp[p[i]]+v(p[i],i)最优。并且p数组单调不下降,根据单调不下降的性质可以维护一个单调队列,队列元素为(x,l,r)三元组表示p[l-r]=x。每次添加一个新决策i都要与之前的决策比较,删除p[1~i-1]的决策,维护它最优决策的性质。

  总结一下过程,对于每个i,执行下列操作:

  1.设队首为(j0,l0,r0),若r0<i,则删除队首,保证队首的决策对应dp[i]。然后再令l0++(举例:当队首为(1,2,5),而i==2时,删除p[2],因为对i+1来说p[1~i]没有意义)。

  2.计算dp[i]=dp[j0]+v(j0,i)

  3.插入新决策i(具体过程见板子)。

        q[].x=;q[].l=;q[].r=n;t=h=;
for(int i=;i<=n;i++){
while(h<=t&&q[h].r<i) h++;//h表示队首,删除队首
q[h].l++;
dp[i]=dp[q[h].x]+val(i,q[h].x);
int pos=1e9;
while(h<=t&&dp[i]+val(q[t].l,i)<=dp[q[t].x]+val(q[t].l,q[t].x))
pos=q[t].l,t--;//当队尾决策都不如决策i好时,删去队尾
if(h<=t&&dp[q[t].x]+val(q[t].r,q[t].x)>dp[i]+val(q[t].r,i)){
int l=q[t].l,r=q[t].r,mid,p1=q[t].r+;
while(l<=r){//二分求出以i为最优决策的位置p1,p1之后i决策更优
mid=l+r>>;
if(dp[q[t].x]+val(mid,q[t].x)>=dp[i]+val(mid,i))
p1=mid,r=mid-;
else
l=mid+;
}
q[t].r=p1-;pos=p1;
}
if(pos<=n){
++t;q[t].l=pos;q[t].r=n;q[t].x=i;
}
}

板子

dp优化---四边形不等式与决策单调性的更多相关文章

  1. 省选算法学习-dp优化-四边形不等式

    嗯......四边形不等式的确长得像个四边形[雾] 我们在dp中,经常见到这样一类状态以及转移方程: 设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\ ...

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

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

  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,b,c,d\),在满足\(a\leq b\leq c \leq d\)时,都有\(w(a,d) ...

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

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

  8. DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)

    前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [D ...

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

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

随机推荐

  1. tf.slice()函数详解(极详细)

    目录 1.官方注释 2.参数解释 3.例子 参考 @(tf.slice()函数详解 ) tf.slice()是TensorFlow库中分割张量的一个函数,其定义为def slice(input_, b ...

  2. 【Weiss】【第03章】练习3.15:自调整链表

    [练习3.15] a.写出自调整表的数组实现.自调整表如同一个规则的表,但是所有的插入都在表头进行. 当一个元素被Find访问时,它就被移到表头而并不改变其余的项的相对顺序. b.写出自调整表的链表实 ...

  3. java实现QQ、微信、轰炸机,撩妹,抖图功能,轻松自如

    今天交大家一个很牛的功能,让你朋友服你,他不扶你你来找我. 打游戏被骂,骂不过你来找我,我们有神器,直到他怕了为止. 废话少说,代码如下,动手,干就完了 乞丐版如下 参考连接:Java实现QQ微信轰炸 ...

  4. Sqli-labs 搭建SQL注入平台

    sqli-labs是一款学习sql注入的开源平台,共有75种不同类型的注入. 搭建步骤: 1.在Windows系统中安装WAMP 下载地址:https://pan.baidu.com/s/1HY0hF ...

  5. Fiddler3 使用技巧

    1.Fiddler抓不到包怎么解决 (1)先确定是HTTP包抓不到还是HTTPS包抓不到.如果只是HTTPS包抓不到,说明是证书的问题,需要重新安装证书. (2)检查浏览器的HTTP代理设置是否正确, ...

  6. 12. Java 获取指定字符第N次出现的位置

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo { //判断"Ab2Ad3 ...

  7. masql数据库的表查询

    昨日回顾 表与表之间建关系 一对多 换位思考 图书与出版社 先站在左表: 考虑左表的多条数据能否对应右表的一条数据 翻译:多本书能否被一个出版社出版 可以! 注意:单站在一张得出的表关系并不能明确两张 ...

  8. NLP interview

    2019-08-26 17:19:58 1)聊实习项目 2)代码题,二维数组中的查找某个target 3)讲一些最能体现创新能力的工作,而不是一些工程上的实现 4)讲论文可以从哪些方面做创新点,文本生 ...

  9. display:flex 简单记录

    1.有写了 display:flex:这个就是 采用了 flex布局的 元素 这个元素可以 写 6个属性: flex-direction : row |  column  | row-reverse ...

  10. 构建安全可靠的微服务 | Nacos 在颜铺 SaaS 平台的应用实践

    作者 | 殷铭  颜铺科技架构师 本文整理自架构师成长系列 3 月 19 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "319",即可获取对应直播回放链接 ...