前言

本文将介绍决策单调性优化 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. 指针进阶(回调函数)(C语言)

    目录 1. 回调函数是什么? 2. qsort 使用 2.1 使用qsort函数排序整形数据 2.2 使用qsort排序结构数据 3. qsort函数的模拟实现 1. 回调函数是什么? 回调函数就是一 ...

  2. 人口分析实战(利用jupyter)

    目录 1.项目需求 2.开始操作 2.1导入我们所需要的包 2.2导入数据.查看原始数据 2.3对数据进行清洗 2.4对数据进行处理 1.项目需求 需求: 导入文件,查看原始数据 将人口数据和各州简称 ...

  3. Python3 编程面试题

    Python global 语句的作用 lambda 匿名函数好处 Python 错误处理 Python 内置错误类型 简述 any() 和 all() 方法 Python 中什么元素为假? 提高 P ...

  4. 在使用asm包进行动态类加载的时候的打包问题

    如图所示,开发时使用的jdk包下面的asm包,在进行打包时提示asm包不存在,打包方式使用如下: 目前提供两种解决方案: 1:修改打包方式,将jdk的包也打进去: <plugin> < ...

  5. Java常见面试真题之中级进阶(HashMap篇)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Hashtable 与 HashMap 的区别?HashMap 中的 key 我们可以使用任何类作为 key 吗?HashMap 的长 ...

  6. 每日学学Java开发规范,代码格式(附阿里巴巴Java开发手册(终极版))

    前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量. 想细看的可以去 ...

  7. [Windows] 屏幕截图工具Snipaste 开发过程更轻松

    前言 老大:你去把用户登录代码写完. 老大:你把这周的周报发一下 老大:你把生产的数据清理一下. 结果.... 今天刚把登录代码写完,下班,明天就处理别的事情去了!!! 之后我就... 直接F1 截屏 ...

  8. 初识GO语言--函数

  9. 经典强化学习算法:分层强化学习算法—options算法2(理解篇)

    论文地址: https://people.cs.umass.edu/~barto/courses/cs687/Sutton-Precup-Singh-AIJ99.pdf 例子: 这是一个寻路问题,该问 ...

  10. springboot的基本使用

    SpringBoot简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程. 使用了Spring框架后已经简化了我们的开发,而Spr ...