前言

本文将介绍决策单调性优化 DP 的相关内容。持续更新修正,如有差错请指出。

1.四边形不等式优化 DP

1.1 四边形不等式与决策单调性

  • 四边形不等式:如果对于任意的 \(a \le b \le c \le d\) 均成立
\[w(a,d) + w(b,c) \ge w(a,c) + w(b,d)
\]

则称代价函数 \(w\) 满足四边形不等式。观察上述形式,即包含劣于相交,注意这是当我们要求代价函数 \(w\) 最小时四边形不等式的符号,如果我们要求 \(w\) 最大,相当于对其取相反数,那么相应的,此时的四边形不等式需要变号。

四边形不等式优化利用的是状态转移方程中的决策单调性,通常用于解决一系列的最优化问题。

在解决动态规划相关问题的时候,通常会遇到以下这种形式

\[f_i = \min\limits_{j < i} \{ f_j + w(j,i)\}
\]

其中 \(\min\) 也可能是 \(\max\)。一般情形下,这类问题解决的时间复杂度为 \(\mathcal{O(n^2)}\),如果 \(f\) 具有决策单调性,那么就可以将时间复杂度优化至 \(\mathcal{O(n\log n)}\) 甚至 \(\mathcal{O(n)}\)。

  • 决策单调性:设 \(p_i\) 表示 \(f_i\) 取到最小值时 \(j\) 的值(如果有多个 \(j\) 满足则取最小),即 \(f_i\) 的最优决策点。当代价函数 \(w\) 满足四边形不等式时,\(p_i\) 在 \([1,n]\) 上单调不降,\(f\) 具有决策单调性。则我们有
\[\forall i \in [1,n],j \in [0,p_i),f_{p_i} + w(p_i,i) \le f_j + w(j,i)
\]

要证明这一点,可以使用反证法。假设对于 \(f_i,f_j(i < j)\),其最优决策点 \(p_j < p_i\),此时 \(p_j < p_i < i < j\),据四边形不等式有 $$w(p_j,j) + w(p_i,i) \ge w(p_j,i) + w(p_i,j)$$但是根据决策点的最优化条件又有 \(w(p_i,i) \le w(p_j,i),w(p_j,j) \le w(p_i,i)\),即 $$w(p_j,j) + w(p_i,i) \le w(p_j,i) + w(p_i,j)$$与四边形不等式矛盾。

由此得证。

对于 \(f_i\),其具有最小/最大最优决策点,将上述对 \(p_i\) 的定义更换为取最大后,关于原 \(p_i\) 的所有结论都是同样成立的,最大最优决策点同样具有单调不降的性质。注意可能存在 \(i < i'\),但是 \(i'\) 的最大最优决策点小于 \(i'\) 的最小最优决策点,故一般题目当中我们都默认只取最小(大)最优决策点来转移。

1.2 解题套路

通常我们先写出 \(f_i\) 的转移式子,大多数情况下,通常使用

\[w(j,i + 1) + w(j + 1,i) \ge w(j,i) + w(j + 1,i + 1)
\]

来检验代价函数是否满足四边形不等式。

然后对于一个决策,取它作为最优决策点的 \(f_i\) 所组成的是一个区间。对于决策 \(p_i < p_{i'}\),则这两种决策能成为最优决策的区间 \([l_{p_i},r_{p_i}],[l_{p_{i'}},r_{p_{i'}}]\),有 \(r_{p_i} < l_{p_{i'}}\)。

我们写一个二分函数 \(check(j,i)\) 计算出第一个以 \(j\) 作为最优决策不如以 \(i\) 作为最优决策优秀的点,那么可以使用单调队列来维护最优决策点,并进行 DP 转移了。

2.斜率优化 DP

给出例题。

  • P3195 玩具装箱

对于 \([l,r]\) ,其代价为 \((r - l + \sum_{i = l}^r c_i - L)^2\)。

首先对 \(c_i\) 做前缀和。考虑暴力,对于每个 \(i\) 去枚举 \(j\),则有

\[dp_i = min\{dp_j + (i - j - 1 + c_i - c_j - L)^2\}
\]
rep(i,1,n) {
dp[i] = inff;
rep1(j,i - 1,0)
chmin(dp[i],dp[j] + (i - j - 1 + c[i] - c[j] - L) * (i - j - 1 + c[i] - c[j] - L));
}

现在进行优化,把上述式子变形,把 \(1\) 放入 \(L\) 中,\(i,j\) 分别放入 \(c_i,c_j\) 中,有 \((c_i - c_j - L)^2\),把式子里的“常量”提出来展开,变为

\[dp_i - (c_i - L)^2 =dp_j - 2 \times (c_i - L) \times c_j + c_j^2
\]

接下来考虑进行斜率优化,对于一个一次函数 \(y = kx + b\),通常推式子时有以下操作:

  1. 把要求最小值的式子作为截距,即 \(b = dp_i - (c_i - L)^2\)
  2. 把另一边的式子变为 \(y - kx\) 的形式,其中 \(y\) 只与 \(j\) 有关,\(kx\) 同时与 \(i,j\) 有关
\[y = dp_j + c_j^2\\
k = 2(c_i - L)\\
x = c_j\\
b = dp_i - (c_i - L)^2
\]

显然,\(b_i\) 取到最小值的点在这个下凸壳上,因为这个斜率是单调的,可以考虑用单调队列来维护,此时 \(\text{slope}(q_{i - 1},q_i) < \text{slope}(q_{i},q_{i +1})\)。

那么当 \(\text{slope}(q_{i - 1},q_i) \leq k < \text{slope}(q_i,q_{i + 1})\),\(b\) 在 \(q_i\) 上取得最小值。

代码就很好写了。

il db slope(int i,int j) {
return (db)(y[i] - y[j]) * 1.0 / (db)(x[i] - x[j]);
} il void solve() {
//------------code------------
read(n,L);
++ L;
rep(i,1,n) read(c[i]),c[i] += c[i - 1];
rep(i,1,n) c[i] += i;
rep(i,1,n) {
int k = 2ll * (c[i] - L);
while (hh <= tt && slope(q[hh - 1],q[hh]) <= k * 1.0) ++ hh;
dp[i] = y[q[hh - 1]] - k * x[q[hh - 1]] + (c[i] - L) * (c[i] - L);
x[i] = c[i],y[i] = dp[i] + c[i] * c[i];
while (hh <= tt && slope(q[tt - 1],q[tt]) >= slope(q[tt],i)) -- tt;
q[++ tt] = i;
}
write(dp[n],'\n');
return ;
}

决策单调性优化 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. BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】

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

  8. 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 ...

  9. 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)

    题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...

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

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

随机推荐

  1. nosql的衍生与数据库的拆分

    nosql简单介绍 Redis:开源.免费.非关系型数据库.K-V数据库.内存数据库,支持持久化.事务和备份,集群(支持16个库)等高可用功能.并且性能极高(可以达到100000+的QPS),易扩展, ...

  2. error loading sources list: ('The read operation timed out',)解决办法!!

    一.灵魂四问 1.为什么叫rosdepc? rosdepc,c指的是China中国,主要用于和rosdep区分. 2.rosdepc和rosdep功能一致吗? rosdep官方最新版源码直接修改的,小 ...

  3. C语言(从入门到入土)

    1.C语言整体上需要记住的 总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构 (三个循环结构), 选择结构 (if 和 switch) 2)读程序都要从main()入口, 然后从最上面 ...

  4. EDUSRC | 记录几张edusrc证书站挖掘

    在web资产挖证书站是比较难的,尤其是没有账号密码进入后台或者统一的情况下,于是便转变思路,重点放在信息收集,收集偏远资产上. 一.XX大学 srping actuator未授权 茫茫c段,找到这么一 ...

  5. SSIS作业提示所请求的 OLE DB 访问接口 Microsoft.ACE.OLEDB.12.0 尚未注册

    没有跨不过的坎,也没有解决不了的问题,那些曾经没有把我们打死的困难,最终都会让我们变得更加强大 最近在使用ETL获取Excel数据时,在本地运行没有任何问题,部署到服务器后,使用作业运行时便一直提示以 ...

  6. 关于CP2102(USB转TTL模块)的驱动安装、电脑识别、接线

    一.CP2102 与 CH340 对比 特性 CP2102 CH340 芯片制造商 Silicon Labs WCH(江苏沁恒) 接口 USB USB 最大波特率 1 Mbps 2 Mbps 支持操作 ...

  7. LVM 使用与扩容总结

    转载请注明出处: LVM(Logical Volume Manager,逻辑卷管理器)是一个用于Linux系统的磁盘管理工具.它提供了一种更加灵活的存储管理机制,可以方便地进行磁盘的扩容.缩减.快照以 ...

  8. 海外模组联网非常难?不往忘了APN配置…

    ​ 除了中国之外,国外的4G信号都比较差劲. 做海外的设备,如果忽视了射频的信号质量,肯定是要吃大亏的! 所以,海外模组的联网问题,会比国内要多不少. 客户在实际应用中或多或少都会遇到: 网络相关问题 ...

  9. MySQL创新版9.1.0于2024年10月15日正式发布-新功能特性先睹为快[译]

    这个十月发布的版本是MySQL宣布转向新的LTS/Innovation发布模式后的第三个长期支持(LTS)版本和第二个创新(Innovation)版本.更多细节请参见MySQL发布:创新和长期支持.在 ...

  10. mvn eclipse:eclipse -Dwtpversion=2.0 -DdownloadSources=true -DdownloadJavadocs=true -DjdkLevel=1.6

    mvn eclipse:eclipse -Dwtpversion=2.0 -DdownloadSources=true   -DdownloadJavadocs=true -DjdkLevel=1.6