dp优化---四边形不等式与决策单调性
四边形不等式
定理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优化---四边形不等式与决策单调性的更多相关文章
- 省选算法学习-dp优化-四边形不等式
嗯......四边形不等式的确长得像个四边形[雾] 我们在dp中,经常见到这样一类状态以及转移方程: 设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\ ...
- dp优化-四边形不等式(模板题:合并石子)
学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- 区间dp之四边形不等式优化详解及证明
看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- 『一维线性dp的四边形不等式优化』
四边形不等式 定义:设\(w(x,y)\)是定义在整数集合上的的二元函数,若对于定义域上的任意整数\(a,b,c,d\),在满足\(a\leq b\leq c \leq d\)时,都有\(w(a,d) ...
- 区间DP的四边形不等式优化
今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [D ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
随机推荐
- C# 基础知识系列- 1 数据类型
常见数据类型 C#的类型一般分为值类型.引用类型两大类型. 值类型的实例存放在栈中,引用类型会在栈中放置一个指针指向堆中的某一块内容. C#为我们内置了几个数据类型供我们使用: 关键词简写 对应的类全 ...
- shell脚本基础-语法
一 变量 [root@T_FOOT-Home2-ZZZ01 ~]# a=hello [root@T_FOOT-Home2-ZZZ01 ~]# echo $a hello [root@T_FOOT-Ho ...
- Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template
pl-drag-template Github地址:https://github.com/livelyPeng/pl-drag-template 前言 想必你一定使用过易企秀或百度H5等微场景生成工具 ...
- 小米官网轮播图js+css3+html实现
官网轮播: 我的轮播: 重难点: 1.布局 2.图片和右下角小圆点的同步问题 3.setInterval定时器的使用 4.淡入淡出动画效果 5.左右箭头点击时,图片和小圆点的效果同步 6.另一种轮播思 ...
- python的进制转换
转载于:https://www.cnblogs.com/FWF1944/p/11132409.html(方法论190404) Python整数能够以十六进制,八进制和二进制来编写,作为一般以10位基数 ...
- 关于MySQL 建表的一些建议
由于在生产环境下,我们对MySQL数据库的操作通常是通过命令行进行操作,因此,建议建表的时候也手写MySQL语句(不建议用图形界面建表). 1.添加注释的格式 在编写MySQL语句时,我们通常会被要求 ...
- 从ISTIO熔断说起-轻舟网关熔断
最近大家经常被熔断洗脑,股市的动荡,让熔断再次出现在大家眼前.微服务中的熔断即服务提供方在一定时间内,因为访问压力太大或依赖异常等原因,而出现异常返回或慢响应,熔断即停止该服务的访问,防止发生雪崩效应 ...
- c#委托、泛型委托和匿名方法
题外话:别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍. 本人女猿一枚,2年工作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知自身能力薄弱,如表达错误.不当之处请园友们多多指出,互相交 ...
- effective-java学习笔记---优先使用泛型方法30
泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用. 当你设计新的类型时,确保它们可以在没有这种强制转换的情况下使用. 这通常意味着使类型泛型化. 如果你有任何现有的类型,应该是泛型的但实际 ...
- 探索学习率设置技巧以提高Keras中模型性能 | 炼丹技巧
学习率是一个控制每次更新模型权重时响应估计误差而调整模型程度的超参数.学习率选取是一项具有挑战性的工作,学习率设置的非常小可能导致训练过程过长甚至训练进程被卡住,而设置的非常大可能会导致过快学习到 ...