决策单调性优化 DP
前言
本文将介绍决策单调性优化 DP 的相关内容。持续更新修正,如有差错请指出。
1.四边形不等式优化 DP
1.1 四边形不等式与决策单调性
- 四边形不等式:如果对于任意的 \(a \le b \le c \le d\) 均成立
\]
则称代价函数 \(w\) 满足四边形不等式。观察上述形式,即包含劣于相交,注意这是当我们要求代价函数 \(w\) 最小时四边形不等式的符号,如果我们要求 \(w\) 最大,相当于对其取相反数,那么相应的,此时的四边形不等式需要变号。
四边形不等式优化利用的是状态转移方程中的决策单调性,通常用于解决一系列的最优化问题。
在解决动态规划相关问题的时候,通常会遇到以下这种形式
\]
其中 \(\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\) 具有决策单调性。则我们有
\]
要证明这一点,可以使用反证法。假设对于 \(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\) 的转移式子,大多数情况下,通常使用
\]
来检验代价函数是否满足四边形不等式。
然后对于一个决策,取它作为最优决策点的 \(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\),则有
\]
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\),把式子里的“常量”提出来展开,变为
\]
接下来考虑进行斜率优化,对于一个一次函数 \(y = kx + b\),通常推式子时有以下操作:
- 把要求最小值的式子作为截距,即 \(b = dp_i - (c_i - L)^2\)
- 把另一边的式子变为 \(y - kx\) 的形式,其中 \(y\) 只与 \(j\) 有关,\(kx\) 同时与 \(i,j\) 有关
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的更多相关文章
- Lightning Conductor 洛谷P3515 决策单调性优化DP
遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- 2018.09.28 bzoj1563: [NOI2009]诗人小G(决策单调性优化dp)
传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的 ...
- [BZOJ4850][JSOI2016]灯塔(分块/决策单调性优化DP)
第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由 ...
- BZOJ2216 Poi2011 Lightning Conductor 【决策单调性优化DP】
Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt( ...
- 决策单调性优化dp 专题练习
决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...
- BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】
Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- 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 ...
- 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)
题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...
- 算法学习——决策单调性优化DP
update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性? 在满足决策单调性的情况下,通常决策点会形如1111112222224444445555588888 ...
随机推荐
- TrueNAS关闭5357端口
sockstat -4l 查看监听5357端口进程的ID. 用kill -9 PID 干掉进程.
- 实践出真知,小程序wepy,uni-app框架开发使用!
一.前提 目前我只使用过wepy和uni-app框架开发过小程序,着重比较这两个框架使用感受! 另外wepy框架已经不维护了,希望uni-app好好维护下去! wepy和uni-app都是类似于vue ...
- Google Guice 与 Noear Solon 的简单对照
1. 简介 Google Guice 是一个轻量级的依赖注入框架,它支持Java 5或者更高版本的JDK.Noear Solon 也是一个轻量级的依赖注入框架,它支持Java 8或者更高版本的JDK ...
- springBoot项目启动卡在Root WebApplicationContext: initialization completed... (非DEBUG断点问题)
通过源码启动排查发现,初始化连接池时创建了200次,通过配置文件中将initialSize值改为10,启动时间从1分钟变为了3秒.
- glibc 内存分配与释放机制详解
作者:来自 vivo 互联网存储团队- Wang Yuzhi 本文以一次线上故障为基础介绍了使用 glibc 进行内存管理可能碰到问题,进而对库中内存分配与释放机制进行分析,最后提供了相应问题的解决方 ...
- Java反射调用get/set方法,你还在这样用?
之前有些场景下碰到需要用到反射调用JavaBean的get/set方法时都是像以下这种拼接的方式来实现方法的调用. Article article = new Article(); article.s ...
- think in java interview-高级开发人员面试宝典(二)
从现在开始,以样题的方式一一列出各种面试题以及点评,考虑到我在前文中说的,对于一些大型的外资型公司,你将会面临全程英语面试,因此我在文章中也会出现许多全英语样题. 这些题目来自于各个真实的公司,公司名 ...
- weex跨页面通信
需求: A页面有表单和表格,点击表格中的按钮到B页面,B页面操作完毕,再次回到A页面,表单元素保持不变,表格内容刷新. 通过管道通信去做,用两个管道嵌套,A页面跳转到B页面的时候,直接用管道发过去,B ...
- GitBook之基本使用
GitBook 简介 GitBook 官网 GitBook 文档 GitBook 准备工作 安装 Node.js GitBook 是一个基于 Node.js 的命令行工具,下载安装 Node.js,安 ...
- git针对指定网站设置代理
我们经常要用到各种git地址,比如github.gitee还有自己搭建的git等等. 但是github我们经常拉取和推送代码的时候超时,这时候如果我们搜索会发现大量的文章都是告诉我们设置全局系统代理: ...