决策单调性的概念&证明工具:

决策单调性,是在最优化dp中的可能出现的一种性质,利用它我们可以降低转移的复杂度。

首先dp中会有转移,每个状态都由若干个状态转移而来,最优化dp比较特殊,只能由一个最优的状态转移而来。

我们称之为某个状态的最优转移点。

然后,dp会有一个转移顺序,比如说按层转移,从左到右转移等等(本质就是个DAG)

决策单调性,就是指状态的最优转移点随着dp顺序单调移动。

最经典的就是分段问题 : 将[1,n]分段,分出(l,r]需要c(l,r)的代价,问最小代价。

如果这个c函数啥性质都没有,显然是没有决策单调性的。怎么判定c函数是否具有决策单调性呢?

一种常用的方法是暴力DP观察转移点,这是篇讲理论的文章,这种方法就不多说了。

注意,下面讲的都是最小化问题,最大化请自行将权值部分的不等号反向。

  • 四边形不等式

    假如我们有 p1≤p2≤p3≤p4.

    则 c(p1,p3)+c(p2,p4)≤c(p1,p4)+c(p2,p3) 称为四边形不等式。

    简而言之,交叉≤≤包含。

  • 1D​ : 任意分

如果不限段数,分一段的代价为 c(l,r),如果c满足四边形不等式,则该问题具有决策单调性。

设F[i]为把前�i个位置分割完毕的最小代价。

证明:证明: 设F[i]的最优转移点为p[i],我们假设有 y<x 且 p[x]<p[y]。

根据最优决策的定义,写出相应的不等式:

F[x]=F[p[x]]+c(p[x],x)≤F[p[y]]+c(p[y],x)

有 p[x]<p[y]<y<x ,由四边形不等式得

c(p[x],y)+c(p[y],x)≤c(p[x],x)+c(p[y],y)

同向不等式相加得到

F[p[x]]+c(p[x],y)≤F[p[y]]+c(p[y],y)

得到 p[x]→y 比 p[y]→y 更优,矛盾,故得证。

区间DP问题也是类似的。

  • 包含单调

    p1≤p2≤p3≤p4⇒c(p1,p4)≥c(p2,p3) 称之为包含单调。

  • 2D2D​ : 分k段

在分k段问题中,有这样一个麻烦,如果分得短反倒亏,就可能不满足单调性。

如果c函数包含单调,那么分的段越多越好,就没这个问题了。(存疑)

应用可见 stO 花神


常用优化手段:

(1)有单峰性-单指针跳跃 - 1D​

“单峰性”的意思是:对于某个状态的最优转移点,其左边的贡献向左单调递减,右边也向右单调递减(一个单峰函数)

这个性质结合决策单调性,可以做到均摊O(1)转移,具体方法:

记录一个指针p表示转移点,由于决策单调性那么p不会往回跳。

进入了每一层之后,如果后面更优,p向后跳,否则停住并转移,根据单峰性这样子一定不会漏最优解。

那么p指针总共跳(O(状态))次,那么转移均摊O(1).

例题:暂无

(2)相邻层之间转移 - 分治 - 2D​

这个适用于特殊的二维dp,只有上一层向下一层转移,同一层之间不会转移。

而且每一层中有决策单调性。

我们可以发现,一般暴力做是O(n2k)(k是层数),每次转移需要多一个 O(n)的for来枚举前一层。

又发现,在这一层,我们先转移哪一个位置是无关紧要的,因为同一层之间不会转移。

考虑分治,可以先转移mid,得到最优转移点是上一层的p。

之后,我们就能知道 [1,mid)和 (mid,r]分别对应候选转移点区间 [tl,p] 和 [p,tr] (注意区间开闭).

这样子的分治复杂度是 O(nlogn)的,不过好像并不显然。

证明的话,每一层的候选区间长度总和为 O(n),一共 O(logn)层,总复杂度严格 O(nlogn)

例题:P4072 [SDOI2016]征途 (的 O(n2logn)辣鸡写法)

(2+)贡献难算-分治&指针暴力跳 - 2D​

这只能算是一个小技巧吧。

(先看)例题:CF833B The Bakery

这个决策单调性在这里不证明了,感性理解就是选的区间越长越可能亏。

(直接拿暴力dp打出决策点的表,然后大眼观察也可以)

请大家先想一下O(n3k)的暴力。

这题难就难在无法O(1)或者O(logn)算出区间颜色数,我们的复杂度强行多了一个n.

先直接套用(2)的分治,区间颜色数是莫队的拿手好戏,我们考虑模仿莫队,维护两个指针跳来跳去。

然后一个很暴力的想法是,问到那个区间,就跳到哪个区间。

第一眼看上去复杂度似乎假了,但是分治树自有它的特殊性质:

对于mid的查询,我们会询问∀i=tlmid​s(i,mid)

右端点是固定的,那么左端点一共只会移动(O(候选区间长度))次。

当处理[l,r][tl,tr]这一任务时, l,r指针一定属于[tl,tr].

然后要向儿子分治求解,给到左儿子的时候要先暴力跳到 [tl,midL],同样不会跳出 [tl,tr]

从左儿子那里还回来之后,暴力给右儿子准备,不会跳出[tl,tr]。

这一部分也只会移动(O(候选区间长度))次。

根据(2)的证明,一次分治总复杂度就依然是O(nlogn)

附: P5574 [CmdOI2019]任务分配问题

(3)二分队列 - 1D​

方程形如 f[ i ]=j=0mini−1​f[j]+w(i,j)

决策单调性的推论:有两个决策位置 i,j(i<j)。

我们让i,j向k尝试着转移,不妨设i更优。

随着k的增大(右移),j有可能变得比i更优,但是此后i就永无翻身之日了。

也就是说,每个出发点能最优的目的地是一个区间,而且只会被后面的决策反超。(这和经典决策单调性是等价的)

这个过程暗示着一个分界线′k′在这前面的k,用i转移更优,在这后面的用j转移更优。

如果我们能快速计算贡献函数 w 的话,就能用(log⁡)O(logn)的代价计算出两个决策位置 i,j(i<j)的分界线 ′k′。

换句通俗的话说, j能在到达 ′k′之后怼掉 i。

然后,我们按照优劣维护一个单调队列,那么队首就是目前的最优转移。

  • 退役 : 弹出队首

    每一个候选点都想怼掉前面那个目前比他优的点,我们存下每个点能叉掉前一个点的位置。

    如果 k前进了,我们要判断队首有没有被下一个叉掉,如果有就弹出。

  • 新人 : 队尾加入决策

    考虑一个候选决策点的命运,随着 k的增大为时间线,无非是先养精蓄锐,然后叉掉别人,然后再被别人叉掉。

    前面的决策随着 k增大可能会被后面的反超,则是经典的决策单调性,由于要养精蓄锐,我们从队尾加入新决策。

    假如这个决策能比最后一个更快地叉掉倒数第二个,则pop最后一个,一直进行……

    最后把新决策加入进去,这被称为二分队列。

观察可得这个队列是同时根据优劣和叉掉上一个人的时间为序的,这就可以保证所有叉人活动只在队首进行。

例题:P1912 [NOI2009]诗人小G

(3+)二分栈 - 1D​

严格来讲这东西并不是所谓的决策单调性,但是和(3)十分类似,所以附带着讲讲。

还是最小化问题,方程: f[i]=j=0mini−1​f[j]+w(i,j)

每个出发点能最优的目的地是一个区间,但是 : 某种决策只会被更前的决策反超.

考虑某个决策的命运,随着 k的增大为时间线,一开始就叉掉别人(注意这些人都是前面的,如果叉不掉就相当于被别人叉掉,根据上述性质就永无翻身之日了)

然后苟一会,再被别人(前面后面都有可能)叉掉。 (所以这个东西根本没有决策单调性啊)

看起来比较复杂,但是决策分界点仍然可以二分求出来,拿一个栈就能维护了。

还是套路,维护每个点能叉掉前一个点的位置,如果栈顶被叉掉了就弹出来。

由于只能在一开始怼人,加入元素的时候需要从栈顶加入,加入方法不是叉栈顶,而是比较优劣,如果劣于栈顶就直接丢掉,否则push进去。

然后,根据(3)的经验需要同时根据优劣和叉掉上一个人的时间为序。

我们在push前还要比较 : 栈次顶会不会在能够叉掉新决策之前就被下一个干掉(其实就是维护分界点有序),如果是就弹出来。

这样子就被称为二分栈。

例题 : P3515 [POI2011]Lightning Conductor

(4)斜率优化 - 1D​

好像技能树点反,怎么先学了二分队列……不管了。

还是极化问题,方程 :  f[i]=j=0mini−1​f[j]+w(i,j)

如果能把 w(i,j)表示成 (i)′+(i)(j)+(j)′+C的形式。

即两坨分别与 i,j有关的常数和与两者都有关的乘积的和。(很多方程都满足这个要求)

(i)′+C相对决策是固定不变的,不需要考虑。

我们把 (i)(j)+(j)′看做一条直线, (i)的位置是 x,决策 j提供了斜率和截距。

我们所做的就是每次用一个 x来切目前的所有直线(决策),来看看那个更优。

显而易见的是,我们需要维护一个上凸壳或者下凸壳(斜率有序)。

现在就变成了一个数据结构维护凸壳的问题。

由于凸壳的单调性,一般有两个重要性质能够加以利用 : ①插入斜率有序 , ②询问�x点单增

  • 同时满足①②

我们只需要单调队列(半平面交)维护凸壳,每次取队首即可。

具体的方法:

  • 队列里维护直线,以及与上一条直线的交点�x坐标。

  • 如果队首被第二个线超过了(看交点),弹出。

  • 如果队尾超过倒数第二的时候,已经被新来的人超过了(看交点),弹出。

其实和二分队列本质上是一个东西,只不过不用二分了。

注意特判没有交点的情况,这时应该根据截距保留。

(一般不用考虑斜率不存在的情况)

例题 : P3195 [HNOI2008]玩具装箱TOY

P4072 [SDOI2016]征途 (2D)

  • 仅满足①

还是单调队列维护凸壳,询问在上面二分(直接看交点管理区间)即可。

  • 啥都不满足

平衡树(std::set)硬上,查询lower_bound,写起来感觉毒瘤……

也可以李超树,一般来讲写起来比较轻松。

还可以CDQ分治之类的。

广义决策单调性

维度更高,一些奥妙的东西。

  • 路径交错

考虑分k段问题,如果段数+1,形成的决策路径必然交错,如下图上半部。

如果出现了下半部的情况,则不合法。

赛场上同样可以打表观察。

如果满足决策单调性,则必然满足路径交错,证明如下:

考虑蓝③的起始点,我们可以把蓝③的终点看做结束点,这比绿③靠前。

如果蓝③的起始点仍在绿③内,这会导致绿③的起始点甚至在蓝③前面,违背了决策单调性。

然后我们就又知道了蓝②的起点在绿②的前面。

通过反向归纳,我们能够得知 : 每个绿色的拱内,都最多只会有一个蓝点。

然后根据鸽笼原理不难得到每个绿拱内恰有一个蓝点。

这有一个好处,所有决策点的决策范围总和是 O(n)的,所以我们暴力枚举范围就很优了。

例题 : CF321E Ciel and Gondolas 的 O(n2)做法。stO 花神

P4767 [IOI2000]邮局 同样可以 O(n2)做掉。

  • 环上路径交错

仍然是分k段问题,这次整到环上来了。

画成图大概是这样的 :

注意,此时蓝①被包在绿①内了,根据鸽笼原理这是必然出现的。

实际上也只会出现一个,证明考虑从①处断开,然后就变成序列问题,沿用结论即可。

另一种环上路径交错 : 钦定某个起点求出最优解,和钦定另一个起点的方案交错(段数相同)。

例题 : 环状邮局

  • O(n2klogn)

    可以枚举某个决策点,然后大力拆环为链。

    变成了 n个经典分k段问题,大力按层单调性分治分治即可O(nklogn)。

  • O(n2logn)

    考虑路径交错,先O(nklogn)求出任意一种方案,然后剩余的所有方案就都是交错的。

    选取最短的(决策点最少)一段,这一段的长度是O(n/k)的,在这一段里面枚举起点即可。

    总复杂度是O(n2logn).

接下来是O(nlogS)的魔法。

先考虑如何快速求出任意一种钦定起点的方案。

能够感知这是凸的,使用WQS二分+二分队列即可做到O(nlognlogS)。

但是可能在构造方案上遇到一点麻烦……可以玄学扰动避免答案凸包三点共线。

当然还有比较系统的构造方法,改日研究。

得到了一种方案之后,我们进行决策单调性分治。由于路径交错,各个点的决策长度总和是O(n)的。

考虑把一段段的东西拆下来分层排成一排,则有这样的模式:

一条折线则表示某种钦定起始点的决策,不难发现折线相交就代表着路径不交错,所以所有折线都是不交的。

现在重头戏来了,我们对起始点分治,对于后面的点依次枚举决策区间进行转移,能够找到一条折线。

这条直线把所有的层分成了两部分,大小和为O(n),于是分治下去找折线,复杂度O(nlogn)的。

[最优化DP]决策单调性的更多相关文章

  1. [NOI2009]诗人小G(dp + 决策单调性优化)

    题意 有一个长度为 \(n\) 的序列 \(A\) 和常数 \(L, P\) ,你需要将它分成若干段,每 \(P\) 一段的代价为 \(| \sum ( A_i ) − L|^P\) ,求最小代价的划 ...

  2. Gym - 101002H: Jewel Thief (背包,分组,DP决策单调性)

    pro:给定N,M.输入N个物品,(si,vi)表示第i个物品体积为si,价值为vi,s<=300,vi<=1e9: N<1e6:现在要求,对于背包体积为1到M时,求出最大背包价值. ...

  3. [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治

    https://loj.ac/problem/6039 我们设dp[i][j]表示考虑所有价值小于等于i的物品,带了j块钱的最大吸引力. 对于ci相同的物品,我们一定是从大到小选k个物品,又发现最大的 ...

  4. [NOI2009]诗人小G --- DP + 决策单调性

    [NOI2009]诗人小G 题目描述: 小G是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并 ...

  5. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  6. bzoj4518: [Sdoi2016]征途(DP+决策单调性分治优化)

    题目要求... 化简得... 显然m和sum^2是已知的,那么只要让sigma(si^2)最小,那就变成了求最小平方和的最小值,经典的决策单调性,用分治优化即可. 斜率优化忘得差不多就不写了 #inc ...

  7. BZOJ2216: [Poi2011]Lightning Conductor(DP 决策单调性)

    题意 题目链接 Sol 很nice的决策单调性题目 首先把给出的式子移项,我们要求的$P_i = max(a_j + \sqrt{|i - j|}) - a_i$. 按套路把绝对值拆掉,$p_i = ...

  8. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  9. BZOJ5125: [Lydsy1712月赛]小Q的书架(DP决策单调性)

    题意:N个数,按顺序划分为K组,使得逆序对之和最小. 思路:之前能用四边形不等式写的,一般网上都还有DP单调性分治的做法,今天也尝试用后者写(抄)了一遍.即: 分成K组,我们进行K-1次分治,get( ...

  10. bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)

    题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...

随机推荐

  1. PHP如何获取短网址跳转之前的网址?

    现在有很多的短网址应用,点击就跳转到缩短之前的网址了,那今天我们就来看一下,PHP如何**短网址跳转之前的网址,其实也很简单,就是用php的get_headers 函数,取得Response Head ...

  2. SpringBoot 如何优雅的进行全局异常处理?

    在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,增加了程序的耦合,同时未 ...

  3. 基于 Probe 的实时全局光照方案(Probe-based Global Illumination)

    目录 Precomputed Probe 预放置 probes 四面体镶嵌(Tetrahedral Tessellations) Indirect Light Cache Volumetric Lig ...

  4. 【Springboot】项目启动后执行特定方法

    Springboot项目启动后执行特定方法 Springboot给我们提供了两种"开机启动"方式:ApplicationRunner和CommandLineRunner. 这两种方 ...

  5. Node版本更新及切换

    Node版本升级 # 清除npm缓存 npm cache clean -f # n模块是专门用来管理nodejs的版本,安装n模块 npm install -g n 1.Windows 由于n命令是在 ...

  6. Sa-Token 多账号认证:同时为系统的 Admin 账号和 User 账号提供鉴权操作

    Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证.权限认证.单点登录.OAuth2.微服务网关鉴权 等一系列权限相关问题. Gitee 开源地址:https://gitee.c ...

  7. IIC、SPI、UART三者对比

    下面将对比三者的各自差异: 参考资料: 1.(112条消息) UART, SPI, IIC的详解及三者的区别和联系_iic spi uart_静思心远的博客-CSDN博客

  8. Redis从入门到放弃(7):主从复制

    1.概念 主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离.数据的复制是单向的, ...

  9. ArcMap时间滑块绘制遥感影像的动态变化过程

      本文介绍基于ArcMap软件,利用时间滑块功能,对大量多时相栅格遥感影像数据进行动态显示,并生成视频或动图的方法.   首先,我们需要在ArcMap软件中新建一个镶嵌数据集,并将全部的多时像遥感影 ...

  10. 「学习笔记」扩展 KMP(Z 函数)

    对于个长度为 \(n\) 的字符串 \(s\).定义 \(z[i]\) 表示 \(s\) 和 \(s[i,n-1]\)(即以 \(s[i]\) 开头的后缀)的最长公共前缀(LCP)的长度.\(z\) ...