DP 转移方程 —— 单调队列优化 斜率优化 李超树优化
前言
最近比赛遇到了一道李超树优化 DPDPDP 方程的题,比赛时推出了方程,但由于对斜率优化方程格式的不熟悉,误以为是斜率优化的问题,导致最终错失 ACACAC,因此想要将这三种格式的方程列举在一起,便于后续查阅。
单调队列优化
首先我们需要回忆单调队列的作用,O(n)O(n)O(n) 求出每一个大小为 KKK 的窗口中的最大、最小值,因此我们可以得到如下 DPDPDP 转移方程:
f[i]=max(v[j])+base[i],i−j≤Kf[i] = max(v[j])+base[i],i-j\leq K f[i]=max(v[j])+base[i],i−j≤K
其中 base[i]base[i]base[i] 是一个仅与 iii 有关的式子,不受 jjj 影响,且可以预处理得到;而 v[j]v[j]v[j] 则是一个仅与 jjj 以及 f[j]f[j]f[j] 有关的式子,不受 iii 影响。
因此我们可以维护一个 v[j]v[j]v[j] 的单调队列,每次从队列中选出最大值更新 f[i]f[i]f[i],这个过程就是单调队列优化 DPDPDP。
斜率优化
在上述单调队列优化过程中,转移方程被拆成了两部分,第一部分仅与 jjj 有关,而另一部分仅与 iii 有关,因此我们可以利用单调队列仅维护与 jjj 有关的部分,实现问题的快速求解。
但仍然有很多转移方程,iii 和 jjj 是紧密相关的,这个时候单调队列优化就不适用了,例如如下转移方程格式:
y[j]=x[j]∗k[i]+f[i]+base[i]y[j]=x[j]*k[i]+f[i]+base[i] y[j]=x[j]∗k[i]+f[i]+base[i]
其中 x[j]x[j]x[j] 与 y[j]y[j]y[j] 是一个仅与 jjj 以及 f[j]f[j]f[j] 有关的式子,不受 iii 影响;而 k[i]k[i]k[i] 与 base[i]base[i]base[i] 则是一个仅与 iii 有关的式子,不受 jjj 影响。因此这个式子的唯一未知量就是 f[i]f[i]f[i],如何选择合适的 jjj 来求取最优的 f[i]f[i]f[i] 就是该转移方程的关键问题。
仔细观察上述式子,不难发现其实这是一个 y=kx+by=kx+by=kx+b 的式子,kkk 由 iii 决定,而 xxx 和 yyy 则由 jjj 决定,因此我们可以将这个问题抽象为,平面上有很多个 (x[j],y[j])(x[j],y[j])(x[j],y[j]) 点,然后我们用斜率为 k[i]k[i]k[i] 的直线去靠近这些点,希望找一个使 bbb 最大的 jjj。
而这种情况下,我们就需要维护上 / 下凸壳,且需要根据具体的题意,如 k[i]k[i]k[i] 是否递增,k[i]k[i]k[i] 是否始终为正,k[i]k[i]k[i] 是否有可能为负等问题来选择具体的维护和转移方法,可能会涉及 setsetset 以及二分的使用。
总结一下,在斜率优化问题中,每一个 jjj 都是一个二维平面上的点 (x[j],y[j])(x[j],y[j])(x[j],y[j]),转移时我们需要用斜率为 k[i]k[i]k[i] 的直线来靠近这些点,使得 b[i]b[i]b[i] 达到最优。
李超树优化
李超树就是维护 nnn 条二维平面线段,并且求某一横坐标下的直线最大 / 小值,如果你对这个算法不熟悉的话,可以查看这篇博客。
李超树优化的转移方程格式如下:
f[i]+base[i]=k[j]∗i+b[j]f[i]+base[i]=k[j]*i+b[j] f[i]+base[i]=k[j]∗i+b[j]
其中 k[j]k[j]k[j] 和 b[j]b[j]b[j] 仅与 jjj 和 f[j]f[j]f[j] 有关;而 base[i]base[i]base[i] 仅与 iii 有关,且可以预处理得到;f[i]f[i]f[i] 则是需要求的值。
在这种格式的转移方程中每一个 jjj 都对应着二维平面中的一条直线 / 线段,因此我们只需要将每一个 jjj 的线段用李超树维护起来,对于每一个 iii,求一下所有线段的最值即可得到 f[i]f[i]f[i] 的最优值。
总结
说了这么多,总结一下上述三种转移方程的核心特点:
- 单调队列优化
- 转移方程可以被划分为两部分,一部分只与 iii 有关,另一部分只与 jjj 有关,因此可以对只与 jjj 有关的部分维护单调队列。
- 斜率优化
- 每一个 jjj 都可以看作平面上的一个点,直线的斜率由 iii 决定,因此需要选择合适的点,使得直线的截距最优。
- 李超树优化
- 每一个 jjj 都可以看作平面上的一条直线,f[i]=k[j]∗i+b[j]f[i]=k[j]*i+b[j]f[i]=k[j]∗i+b[j],因此用李超树维护每一条直线,在 iii 处求最值即可。
DP 转移方程 —— 单调队列优化 斜率优化 李超树优化相关推荐
- 单调队列 → 常用于动态规划问题的优化
[算法解析] 单调队列是指在队尾入队出队,在队首出队,且其元素具有单调性的特殊队列.其中,在队尾入队出队的操作是用来维护单调队列的单调性,在队首出队的操作是用来维护单调队列的大小.单调队列常用于动态规 ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- [WF2011] MachineWorks(李超树优化dp)
[WF2011]MachineWorks problem BZOJ3963 solution 来得比较快的是,直接设 dpi,j:dp_{i,j}:dpi,j: 考虑第 jjj 天换购 iii 机器 ...
- Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值
文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...
- 【C++心路历程25】课堂讲义【dp加单调队列】
[问题描述] 高二数学<课堂讲义>总共有n道题目要抄,编号1..n,抄每道题所花时间不一样,抄第i题要花 a[i] 分钟.由于 xxx还要准备IOI,显然不能成天写课堂讲义.xxx决定只用 ...
- 浅谈单调队列优化的DP
为什么都是浅谈?深入就掉坑啊,掉坑就要填坑啊,填坑就会发现又挖了更多的坑啊,然后恶性循环啊. 这个坑必须要填的,拖了这么久了. 先拿TYVJ 1305来说吧,此题具体的题面没找到,代码简单的对拍了一下 ...
- 多重背包单调队列优化思路_多重背包问题
题目描述: 无优化版本: int main(){int m, n;cin >> n >> m;for(int i = 1; i <= n; ++i){int v , w, ...
- 瑰丽华尔兹--单调队列
看到这道题,的标签 [我csdn的博客] (https://blog.csdn.net/qq_42421714/article/details/84963779) 我洛谷的博客 说明啊,它可以用单调队 ...
- Luogu4085 [USACO17DEC]Haybale Feast (线段树,单调队列)
\(10^18\)是要long long的. \(nlogn\)单调队列上维护\(logn\)线段树. #include <iostream> #include <cstdio> ...
- 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)
文章目录 前言 李超树 引入(斜率优化) 什么是李超树? 李超树活着能干点什么? 算法思想(使用手册?) 插入 查询 模板 判断是否覆盖(优不优) 插入 查询 例题 板题:BlueMary开公司 分析 ...
最新文章
- XenServer和VMware vSphere技术比较
- pytorch lstm 写诗文的魔改,测试,猜想
- python学习手册条件-Python学习手册(第4版)pdf
- No.7 nginx、nfs、集群
- 调用gensim库训练word2vec词向量
- (45)npm全局安装包的位置
- 【kafka】Attempted to write a non-default produerId at version 1
- Kruskal算法 最小生成树
- 五分钟快速过完Verilog HDL基本概念(4)代码的编写标准
- C-Free 5.0注册码分享
- python xy 2.7下载_pythonxy 安装
- 赢在CSDN——谈谈程序员为什么要持续学习和创作?对CSDN的期待、个人创作的规划
- DeviceDriver(十四):多点触摸(MT协议,Input子系统)
- keil工程 freertos+emwin AC5编译器移植到AC6编译器
- Playcanvas 上手使用
- python No handlers could be found for logger错误的解决
- IPUtils工具类
- 汽车钥匙芯片工作原理 浅谈汽车钥匙芯片作用及分类
- GD32F103C读写flash
- 【机器学习】之机器学习方法的分类