算法优化》关于1D*1D的DP的优化
关于这一主题的DP问题的优化方法,我以前写过一篇博客与其有关,是关于对递推形DP的前缀和优化,那么这种优化方法就不再赘述了。
什么叫1D*1D的DP捏,就是一共有N种状态,而每种状态都要N种决策,这就叫1D*1D的DP,对于这种DP一般来说状态的转移都是可以从O(N2)优化到O(NlogN)甚至O(N)的,那么,针对于不同的情况,也有不同的优化方法
经典模型一:(b[x]随x非降)
对于DP方程形似与这一种的方程,明显的,这种DP的抉择方案数可以用单调队列直接解决化为O(1),所以对于这样的转移方程复杂度就可以化为O(N);
经典例题:POJ(2823)Sliding Window 给出友情链接刷题向》POJ2823 单调队列裸题(<不会做,请自裁>系列)
这道题无疑就是单调队列的最经典例题,那么用单调队列来解释也很容易。
接下来解释怎么用单调队列来维护这种题的最优最优决策数,
我们每次要做三个操作
1.将队首元素出队,直到队首元素属于b[x]~x-1
2.将队首元素作为最优解计算(由于单调队列的性质)
3.将g[x]加入队列,维护单调性
很容易得出复杂度为O(N)
经典模型二:
这种问题与决策单调性密切相关。那么什么是决策单调性捏?
当对于一个f(x),决策g(a')比g(a)优,并且a'>a,那么对于任意的x'>x,决策g(a')仍然比g(a)优。 即∀a<=a',g(a)<=g(a');
显然的,并不是所有的方程都满足这一性质,首先我们先判断哪些DP方程有这一性质。
设s(x,i)为当判断到第x个,决策是第i个数时的函数值,s(x,i)=f(i)+w[i,x];
那么也就是说:现在已知s(x,i')>=s(x,i) i'<i(式1),试求满足s(x',i')>=s(x',i)(x<x')(式2)的条件;
我们先把式子打开,可以得到f(i')+w[i',x]>=f(i)+w[i,x](i'<i),我们再把式子左边加上w[i',x']-w[i',x],右边加上w[i,x']-w[i,x],就可以得到式2;
那么显然,要这个不等式成立的条件就是w[i',x']-w[i',x]>=w[i,x']-w[i,x];
将其整理得w[i',x']+w[i,x]>=w[i',x]+w[i,x'](i'>i,x'>x);
归纳得出w[i+1,x+1]+w[i,x]>=w[i+1,x]+w[i,x+1](四边形不等式);
也就是说,只有在当前区间函数式满足以上结论时,我们的DP才可以使用抉择单调性优化。一般可以根据题目定义(或打表)判断;
经典例题:BZOJ1010玩具装箱(然而直到本篇博客发表时BZOJ还在维护)
经典模型三:
此问题因为在循环中的F是定值,所以可以转化为更加通用的方程:
得到这个式子之后,我们对这个式子进行一个处理,得到y(i)=-a(n)/b(n)*x(i)+f[n]/b(n);
对于这个式子,我们当前处理的就是用两个数组下标得出来的一元二次方程,那么对于每一个当前要决策的点x,a[x]和b[x]都是固定的,那么对于以上的一元二次方程,斜率都是一定的,那么也就是说,我们只要找到以前的,能使f[n]最大的点就好了。
那么我们可以把以前加入的点的x[n]和y[n]值作为平面上的点,既然有斜率,那么找截距就变成一个十分简单的事情了,只要找到能使截距最大的点就好。
然后我们会发现,我们能求到的最优解一定在这些点形成的上或下凸壳上,然后我们的问题就变成了维护凸壳。
这里有两种情况,
一种情况是这些直线的斜率和在横坐标上的点都是递增的,
在这种情况下,我们维护凸壳可以用单调队列处理,然后移动最优点的位置也是O(1)的,所以最好复杂度就是O(N)的
经典例题:BZOJ1597(土地购买)
还有一种情况,当斜率和横坐标没有任何限制,那么我们就不得不用平衡树叠二分来维护凸壳,这样复杂度就是O(NlogN)的。
经典例题:NOI2007国币兑换
关于这种题目暂时就说这么多,到以后或许会更新代码
算法优化》关于1D*1D的DP的优化的更多相关文章
- 1D/1D优化dp之利用决策点的凸性优化
关于dp的优化之前做过一些简单的利用优先队列或者单调队列维护一个值就ok了,但有时候给出的方程很难直接用单调队列维护,需要转化一下思路. 这种优化方式利用数形结合,根据比较斜率来抛去一些非最优解,能将 ...
- DP的优化总结
一.预备知识 \(tD/eD\) 问题:状态 t 维,决策 e 维.时间复杂度\(O(n^{e+t})\). 四边形不等式: 称代价函数 w 满足凸四边形不等式,当:\(w(a,c)+w(b,d)\l ...
- 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼
目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...
- HDU3480_区间DP平行四边形优化
HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前 i 个节点被分为 j 个区间所取得的最优值的情况 cost[i][j]表示从i ...
- 动态规划DP的优化
写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...
- 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...
- 动态规划算法(Dynamic Programming,简称 DP)
动态规划算法(Dynamic Programming,简称 DP) 浅谈动态规划 动态规划算法(Dynamic Programming,简称 DP)似乎是一种很高深莫测的算法,你会在一些面试或算法书籍 ...
- dp斜率优化
算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...
- 【BZOJ-4518】征途 DP + 斜率优化
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 230 Solved: 156[Submit][Status][ ...
随机推荐
- poj1655(dfs,树形dp,树的重心)
这是找树的重心的经典题目. 树的重心有下面几条常见性质: 定义1:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心.定义2:以这个点为根,那么所有的子树(不算整个树自身)的大 ...
- JavaScript 中 this:
在绑定事件时,this指定的是被绑定的那个html元素,比如: 结果: press里的this指的就是canvas.
- linux之文件操作
1. 文件操作思维导图 2. linux系统目录结构及简单说明 linux目录图: root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普 ...
- margin和padding理解
W3C组织建议把所有网页上的对像都放 在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层. 盒模型主要定义四个区域:内容 (content).边框 ...
- PHP Tools for VS2017 key/破解 [搬运]
看看结果 搬运地址 : (自己敲吧...) 这里面破解的只有一年 时间可以在文中提供的 ------------------------------------------------------- ...
- bzoj 2555 SubString——后缀自动机+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 要维护 right 集合的大小.因为 fa 会变,且 fa 构成一棵树,所以考虑用 L ...
- Linux 简单字符设备驱动
1.hello_drv.c (1) 初始化和卸载函数的格式是固定的,函数名自定义 (2) printk是内核的打印函数,用法与printf一致 (3) MODULE_LICENSE:模块代码支持开源协 ...
- 有限状态机(Finite-state machine, FSM)的C语言实现
有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态.当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态.任何一个 ...
- JS 获取鼠标坐标
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 1056 Mice and Rice
题意:略 思路:利用queue来模拟一轮一轮的比赛.自己第一遍做的时候完全没有用queue做的意识,代码写的贼烦最后还只得了17分,非常郁闷.通过本题反映出对queue的应用场景季度不熟悉,STL里面 ...