前言

最近比赛遇到了一道李超树优化 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 转移方程 —— 单调队列优化 斜率优化 李超树优化相关推荐

  1. 单调队列 → 常用于动态规划问题的优化

    [算法解析] 单调队列是指在队尾入队出队,在队首出队,且其元素具有单调性的特殊队列.其中,在队尾入队出队的操作是用来维护单调队列的单调性,在队首出队的操作是用来维护单调队列的大小.单调队列常用于动态规 ...

  2. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  3. [WF2011] MachineWorks(李超树优化dp)

    [WF2011]MachineWorks problem BZOJ3963 solution 来得比较快的是,直接设 dpi,j:dp_{i,j}:dpi,j​: 考虑第 jjj 天换购 iii 机器 ...

  4. Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值

    文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...

  5. 【C++心路历程25】课堂讲义【dp加单调队列】

    [问题描述] 高二数学<课堂讲义>总共有n道题目要抄,编号1..n,抄每道题所花时间不一样,抄第i题要花 a[i] 分钟.由于 xxx还要准备IOI,显然不能成天写课堂讲义.xxx决定只用 ...

  6. 浅谈单调队列优化的DP

    为什么都是浅谈?深入就掉坑啊,掉坑就要填坑啊,填坑就会发现又挖了更多的坑啊,然后恶性循环啊. 这个坑必须要填的,拖了这么久了. 先拿TYVJ 1305来说吧,此题具体的题面没找到,代码简单的对拍了一下 ...

  7. 多重背包单调队列优化思路_多重背包问题

    题目描述: 无优化版本: int main(){int m, n;cin >> n >> m;for(int i = 1; i <= n; ++i){int v , w, ...

  8. 瑰丽华尔兹--单调队列

    看到这道题,的标签 [我csdn的博客] (https://blog.csdn.net/qq_42421714/article/details/84963779) 我洛谷的博客 说明啊,它可以用单调队 ...

  9. Luogu4085 [USACO17DEC]Haybale Feast (线段树,单调队列)

    \(10^18\)是要long long的. \(nlogn\)单调队列上维护\(logn\)线段树. #include <iostream> #include <cstdio> ...

  10. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)

    文章目录 前言 李超树 引入(斜率优化) 什么是李超树? 李超树活着能干点什么? 算法思想(使用手册?) 插入 查询 模板 判断是否覆盖(优不优) 插入 查询 例题 板题:BlueMary开公司 分析 ...

最新文章

  1. XenServer和VMware vSphere技术比较
  2. pytorch lstm 写诗文的魔改,测试,猜想
  3. python学习手册条件-Python学习手册(第4版)pdf
  4. No.7 nginx、nfs、集群
  5. 调用gensim库训练word2vec词向量
  6. (45)npm全局安装包的位置
  7. 【kafka】Attempted to write a non-default produerId at version 1
  8. Kruskal算法 最小生成树
  9. 五分钟快速过完Verilog HDL基本概念(4)代码的编写标准
  10. C-Free 5.0注册码分享
  11. python xy 2.7下载_pythonxy 安装
  12. 赢在CSDN——谈谈程序员为什么要持续学习和创作?对CSDN的期待、个人创作的规划
  13. DeviceDriver(十四):多点触摸(MT协议,Input子系统)
  14. keil工程 freertos+emwin AC5编译器移植到AC6编译器
  15. Playcanvas 上手使用
  16. python No handlers could be found for logger错误的解决
  17. IPUtils工具类
  18. 汽车钥匙芯片工作原理 浅谈汽车钥匙芯片作用及分类
  19. GD32F103C读写flash
  20. 【机器学习】之机器学习方法的分类

热门文章

  1. Nagios 监控温度感应器
  2. 如何使用jquery处理json数据
  3. 九宫格日记:微博难越,前路漫漫
  4. 快餐店选址指南--转
  5. java中ImageIcon路径问题
  6. 斐波那契数列——O(1)算法
  7. xml property标签注入一个类变量_依赖注入的学习
  8. kettlejava脚本的api_kettle java api 执行 Kettle 的作业和 转换
  9. python搭建http服务_Python搭建HTTP服务过程图解
  10. linux python tab补全_Linux设置python自动tab自动补全