用途

废话,当然是在DP式子满足某些性质的时候来优化复杂度……

定义

对于\(j\)往大于\(j\)的\(i\)转移,可以表示成一个关于\(i\)的函数\(f_j(i)\),也就是\(dp_i=\max/\min\{f_j(i)\}\)。

若是取\(\max\),并且在某一个地方\(f_j(i)\)从下面跑到了\(f_k(i)\)的上面(如果加入\(f_j(i)\)这个函数时本来就在\(f_k(i)\)的上面那么不算),就称之为\(j\)取代了\(k\)。取\(\min\)同理。

如果满足决策单调性,那么必须满足:对于任意\(i,j\in [1,n]\),\(f_j(x)\)与\(f_i(x)\)没有交点或是只有一个交点,也就是\(i\)和\(j\)最多取代一次。

狭义的决策单调性是指对于\(i<j\)和他们的决策点\(p_i,p_j\),会有\(p_i<p_j\)。也就是说,对于\(j<k\),就只能有\(k\)取代\(j\)。

广义的决策单调性指只要一个题中取代关系唯一(只有大取代小或小取代大),那么都可以做。

显然,狭义决策单调性也被包含在广义决策单调性内。

显然,狭义和广义是我自己编出来的。

狭义决策单调性

分治

简单易懂,适合\(dp_i=\max/\min\{g_j+w_{i,j}\}\)这种与\(dp_j\)无关的递推式。

考虑一个类似整体二分的做法:设\(solve(l,r,L,R)\)表示已知\([l,r]\)全部由\([L,R]\)转移而来,求出\(dp[l,r]\)。

每次设\(mid=(l+r)/2\),然后暴力扫\([L,R]\),找到\(mid\)的决策点\(p\),然后分治\(solve(l,mid-1,L,p)\),\(solve(mid+1,r,p,R)\)。

复杂度:会做\(\log n\)层,每层的\(\sum(r-l+R-L)\)都是\(O(n)\)的,所以总复杂度\(n\log n\)。

优点:当\(w_{i,j}\)不能\(O(1)\)或\(O(\log n)\)计算时用暴力扫的方式或许可以做出来。

缺点:转移不按顺序,所以递推式必须与\(dp_j\)无关。

注意:如果做的时候还扫了\([R,l]\),那么复杂度分析就会挂!

单调队列

适合\(dp_i=\max/\min\{dp_j+w_{i,j}\}\)的递推式,要求\(w_{i,j}\)可以快速求出。

狭义决策单调性保证了比较靠前的决策点被取代后就可以被忽略了,所以可以维护一个队列,队首是当前最优的决策点,队尾是后面加入、还有潜力取代前面的决策点。(记\(q[l]\)为队首,\(q[r]\)为队尾)

每次考虑\(q[l]\)和\(q[l+1]\),如果\(q[l]\)没那么优,那么就把它弹掉。

加入当前点的时候,就要搞一些事情了。

如果什么都不管直接加入,那么会出现这样的尴尬情况:\(q[l]\)优于\(q[l+1]\),但\(q[l]\)劣于\(q[l+2]\)。

如何避免呢?使用上面\(f_j(x)\)函数数形结合的思想,如果加入这个点\(i\)后\(q[r]\)潜力就没了,也就是\(i\)取代\(q[r-1]\)比\(q[r]\)取代\(q[r-1]\)还快,那么就把\(q[r]\)弹掉。这样一来,上面的\(q[l+1]\)根本就不会出现在队列里面。

至于判断在哪里会取代,那就要二分那个位置了。

复杂度:显然\(O(n\log n)\)。

优点:转移按顺序。

缺点:要求\(w_{i,j}\)可以快速求出。

广义决策单调性

大取代小的时候上面已经讲过,不再赘述。

单调栈

现在是小取代大,比如\(f_2(i)\)一直默默无闻,而\(f_4(i)\)一直是统治地位,突然在\(i=10\)的时候2把4取代了。

这种时候,就不能再用单调队列,而是要用单调栈了。当栈顶没有下面的函数优的时候就弹栈。压入当前函数时若\(st[top-1]\)取代\(i\)比\(st[top]\)还快就弹栈。

本质上其实和单调队列差别不大,也是要二分,也是要求\(w_{i,j}\)能快速求出,复杂度也是\(O(n\log n)\)。

不过小取代大这种情况只有这一种做法,所以就没有优缺点一说了。

判断决策单调性

讲了这么多做法,还没有讲怎么判断这一性质。

一般来说应该是先写出DP式子,各种优化方法试一遍都不行,那就尝试严谨或感性证明。

如果实在不会证,那可能可以打表猜结论。猜中了当然好,但如果随机数据都过了,而结论其实是假的,那……

那你就要祈祷出题人用的就是随机数据。

一般来说我倾向于随机数据猜结论。

决策单调性优化DP学习笔记的更多相关文章

  1. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  2. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  3. 2018.09.28 bzoj1563: [NOI2009]诗人小G(决策单调性优化dp)

    传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的 ...

  4. [BZOJ4850][JSOI2016]灯塔(分块/决策单调性优化DP)

    第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由 ...

  5. BZOJ2216 Poi2011 Lightning Conductor 【决策单调性优化DP】

    Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt( ...

  6. 决策单调性优化dp 专题练习

    决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...

  7. 算法学习——决策单调性优化DP

    update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性? 在满足决策单调性的情况下,通常决策点会形如1111112222224444445555588888 ...

  8. BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】

    Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...

  9. 2018.10.14 NOIP训练 猜数游戏(决策单调性优化dp)

    传送门 一道神奇的dp题. 这题的决策单调性优化跟普通的不同. 首先发现这道题只跟r−lr-lr−l有关. 然后定义状态f[i][j]f[i][j]f[i][j]表示猜范围为[L,L+i−1][L,L ...

随机推荐

  1. js复制内容到粘贴板

    点击右边内容:<span onclick="copyContent(this);" title="点击复制">啊,我被复制了</span> ...

  2. vue滚动分页加载以及监听事件处理

    <template> <div class="bodyContainer"> <div class="allContent" id ...

  3. 【日语】日语单词N3_N4_N5

    日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...

  4. shell 脚本总结

    一.SHELL脚本是什么?它是必需的吗? 一个SHELL脚本就是一个文本文件,它包含一个或多个命令.系统管理员会经常需要使用多个命令来完成一项任务,此时可以添加这些所有命令在一个文本文件(SHELL脚 ...

  5. S3C2440 块设备(待续)

    1.块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位 2.块设备对于I/O请求有对应的缓冲区,因此他们可以选择以什么顺序进行响应,字符设备无须缓冲且被直接读写.对于存储设备而言调整读写 ...

  6. Vue指令之`v-for`和`key`属性

    2.2.0+ 的版本里,**当在组件中使用** v-for 时,key 现在是必须的. 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “**就地复用**” 策略.如果数据项 ...

  7. python高并发的详解

    一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间( ...

  8. 【OF框架】使用原生Sql查询返回实体

    使用原生Sql查询为Entity Framework Core自身的能力,本处描述如何在框架中调用该能力. 框架代码如下: (IoCHelper.Resolve<IDbContextCore&g ...

  9. RT-Thread--内存管理

    内存管理的功能特点 RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提供了不同的内存分配管理算法.总体上可分为两类:内存堆管理与内存池管理,而内存堆管理又根据具体内存 ...

  10. ubuntu18 搭建ftp服务器,以及文件目录权限问题

    有时候呢我们有一台本地的台式机或者云服务器,我们想要搭个ftp服务器好让我们在内网/外网中方便的传输.保存文件,这样别的任何电脑啊,设备啊,只要访问这个ftp的地址,就可以进行文件传输啦!由于我现在台 ...