DP 优化方法合集
0. 前言
写完这篇文章后发现自己对于 DP 的优化一窍不通,所以补了补 DP 的一些优化,写篇 blog 总结一下。
1. 单调队列/单调栈优化
1.2 算法介绍
这应该算是最基础的 DP 优化方法了。
顾名思义,单调队列/单调栈优化 DP 就是保持容器内元素的单调性,以达成减少冗余状态的目的。
举单调队列的例子来说,当一个元素的两种属性(例如下标和权值)都优于另一元素时,就可以用此元素更换掉另一元素。这也正是 OI 界流传说法“当一个人比你小且比你强时,你就被弹出单调队列了”的原理。
我们以下面的例题作为例子来更具体地阐述这个算法。
1.3 适用范围&区别
一般来说,形如 \(f(i)=\max(f(j)+F(i)+F(j))\) 的式子都可以考虑适用单调队列/单调栈进行优化。(其中 \(F(i)\) 和 \(F(j)\) 表示和 \(i,j\) 有关的函数)
应该大部分人刚学这两种东西的时候都有一种疑惑:啥时候用单调队列,啥时候用单调栈呢?(至少我有
其实,它们两的本质区别还是其结构上的区别。单调栈通常用新加进来的东西替换掉一些栈顶元素,而单调队列是可能两端同时修改的。
在一下例题中我也会着重分析两者的使用。
1.4 例题
I. P1886 滑动窗口
这个不是优化 DP,就是最经典的裸的不能再裸的单调队列。
大力单调队列即可,时间复杂度 \(O(n)\)。
II. CF372C Watching Fireworks is Fun
题目链接
OI Wili 推荐的题
题目大意:一个数轴上有 \(n\) 个点,每个点在位置 \(a_i\),有 \(m\) 个烟花要放,开始时间 \(t_i\)。你一开始的位置随便,每一单位时间可以最多走 \(d\) 这么多的距离,在 \(x\) 看到第 \(i\) 个烟花的快乐值为 \(b_i-|a_i-x|\),求最大的总代价。
数据范围:\(n\leq 150000,m\leq 300\)。
看到这个数据范围就知道大概是 \(O(nm)\) 的算法(最多要卡卡常)。
我们容易设计出 DP 状态 \(f(i,j)\) 表示放第 \(i\) 个烟花,位置在 \(j\) 时的最大快乐值。
转移:\(f(i,j)=\max_{j-(t_i-t_{i-1})\cdot d_i\leq k\leq j+(t_i-t_{i-1})\cdot d_i}(f(i-1,k)+b_i-|a_i-j|)\)。
接下来就需要对 DP 进行优化了,首先因为当 \(i\) 和 \(j\) 确定时 \(b_i-|a_i-j|\) 可以看做常数,剩下的就可以用单调队列去维护了。
注:本题使用单调队列的原因为 \(k\) 两边都有限制,需要头尾都更新。
时间复杂度 \(O(nm)\)。
III. P3572 [POI2014]PTA-Little Bird
IV. P1973 [NOI2011] NOI 嘉年华
V. P2254 [NOI2005] 瑰丽华尔兹
2. 斜率优化
斜率优化自己学过好几遍,也听 dalao 讲过,但是总是感觉半懂不懂的。这次索性把它给搞彻底了罢……
2. 1 算法介绍
以 OI Wiki 上的例题为例。
题目大意:有 \(n\) 个玩具,每个玩具有一个价值 \(c_i\)。你需要将这 \(n\) 个玩具分成若干段,设一段 \([l,r]\) 的代价为 \((r-l+\sum_{i=l}^rc_i-L)^2\),其中 \(L\) 为常数,求最小的总代价。
数据范围:\(n\leq 5\times 10^4\)
使用 DP 优化的一般思路:先设计出一个超时的 DP 再优化。
设 \(f_i\) 表示前 \(i\) 个玩具的代价,那么得出转移方程为:
\]
用前缀和表示后即为:
\]
其中 \(S_i=\sum_{k=1}^ic_k\)。
这就是朴素的 \(O(n^2)\) 的 DP。
下面就要优化了,不过有个问题:DP 跟斜率有什么关系呢?
考虑将 DP 转移方程转化为解析几何中直线的斜截式方程 \(y=kx+b\) 的形式。
我们先将只和 \(i,j\) 有关的归为一类,常数归为一类:\(s_i=S_i+i,l=L+1\),然后原式可以写成:
\]
然后可以令 \(y=f_j+s_j^2,k=-2(l-s_i),x=s_j,b=f_i-(s_i-l)^2\)。(P.S. 这个应该只要满足 \(y=kx+b\) 都可以?)
此时需要最小化直线的截距,先将这些 \((x,y)\) 表示在平面直角坐标系中:

可以看到蓝线连成了一个下凸壳,第一个红线碰到的点使截距最小。
DP 优化方法合集的更多相关文章
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- [总结]一些 DP 优化方法
目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单 ...
- 关于Ubuntu系统忘记密码的解决方法合集
昨天有台机器的Ubuntu系统密码出了问题,一直提示错误.由于里面的数据比较重要,不建议重装系统,所以百度了一会,最终解决了忘记密码问题.整理了一个大合集分享出来. 第一种:参考教程如下 ...
- 区间DP入门题目合集
区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解. 基本代码: //mst(dp,0) 初始化DP数组 ;i<=n;i++) { dp[i][i]=初始 ...
- DP问题大合集
引入 动态规划(Dynamic Programming,DP,动规),是求解决策过程最优化的过程.20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了 ...
- Unity3D 角色(物体) 移动方法 合集
1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...
- Vs2015 win10虚拟机启动问题:无法设置UDP端口 解决方法 合集(转载)
刚装的vs2015 社区版 出现这个问题,wp8.1和win10m模拟器都无法启动,找了好久找到的解决方案,放这儿供大家参考,免得大家像我一样走弯路: Windows Phone emulator n ...
- Android中解析JSON格式数据常见方法合集
待解析的JSON格式的文件如下: [{"id":"5", "version":"1.0", "name&quo ...
- [DP优化方法之虚树]
首先我们看一篇文章 转自xyz: 给出一棵树. 每次询问选择一些点,求一些东西.这些东西的特点是,许多未选择的点可以通过某种方式剔除而不影响最终结果. 于是就有了建虚树这个技巧..... 我们可以用l ...
随机推荐
- Fail2ban 运维管理 服务控制
启动监禁 启动所有或者单个监禁项目. # 语法:fail2ban-client start [监禁名称] root@ubuntu:~# fail2ban-client start sshd 停止监禁 ...
- Sass预处理器
CSS预处理器 less,sass和stylus sass:较早,缩进风格 scss:完全兼容css3,使用大括号 编写css的编程语言,引入变量,函数,重复代码等功能,如果编译成css文件 Sass ...
- python基础学习10
python基础学习 内容概要 文件内光标的移动 文件数据修改 函数简介 函数语法结构 内容详情 文件内光标的移动 with open(r'路径','r',encoding='utf8') as f: ...
- XSS防跨站脚本攻击-AntiSamy的基本使用
XSS:跨站脚本攻击(Cross Site Scripting),为不和 CSS混淆,故将跨站脚本攻击缩写为XSS.XSS是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页时,嵌入其 ...
- 深度学习与计算机视觉教程(15) | 视觉模型可视化与可解释性(CV通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- C#.NET读取文本文件的几种办法
一次读取一个字符 //文件路径 string filePath = @"C:\Users\Administrator\Downloads\test\test.txt"; //文本读 ...
- php判断客户端浏览器类型
/** * 判断浏览器名称和版本 */ function get_user_browser() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return ' ...
- 皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)
前言: 知识点运用:正则表达式,有关图形设计计算的表达式和算法,链表的相关知识,Java类的基础运用,继承.容器与多态. 题量:相较于上次作业,这几周在java方面的练习花了更多的精力和时间,所要完成 ...
- Ubuntu远程桌面助手(URDC)
目前自动驾驶域控制器项目中使用了英伟达的Orin芯片+Ubuntu20.04系统.域控属于典型的Headless设备,开发调试时需要连接显示器(HDMI/DP).鼠标和键盘,或者使用NoMachine ...
- nifi从入门到实战(保姆级教程)——身份认证
上一篇我们搭建好了nifi的运行环境了 但是每次登陆那一串随机字符串的用户名和密码是不是让人很头疼,那是人类能记住的吗?当然不是!!!! 那么今天我们就来消灭这些难看又难记的字符串. windows( ...