前言

斜率优化\(DP\)是难倒我很久的一个算法,我花了很长时间都难以理解。后来,经过无数次的研究加以对一些例题的理解,总算啃下了这根硬骨头。

基本式子

斜率优化\(DP\)的式子略有些复杂,大致可以表示成这样:

\[f_i=min_{j=1}^{i-1}(A(j)-B(j)*S(i)+C(i))\]

其中\(A(j)\)和\(B(j)\)是两个只与\(j\)有关的函数,\(S(i)\)和\(C(i)\)是两个只与\(i\)有关的函数,式子中的\(min\)其实也可以替换成\(max\),但这里以\(min\)为例。

不难发现,如果只有\(A(j)\)和\(C(i)\)两项,就是单调队列优化\(DP\)的基本式子了。

但是,由于式子中含有\(B(j)*S(i)\)这一项既与\(i\)相关,又与\(j\)相关的式子,就不能直接用单调队列,而要进行一定转化了。

考虑将\(A(j)\)移到等号左边,并将\(f_i\)移到等号右边,则原式可以转化成这样:

\[A(j)=B(j)*S(i)+(f_i-C(i))\]

注意,在\(i\)不变的时候,我们可以将只与\(i\)有关的项看成常数项。

于是,这个函数就可以看作一条直线,其中\(S(i)\)就相当于这条直线的斜率,而\(f_i-C(i)\)就相当于这条直线的截距

而\(C(i)\)是固定的,因此,如果要让\(f_i\)最小,则应让\(f_i-C(i)\)最小,对应到图像中就是让截距最小。

那么应如何让截距最小呢?

大致思路

首先,我们可以想象有一条斜率固定的直线(我太懒,不想画图... ...),然后图上有若干个点,现在要用这条直线从图的最下方往上慢慢移动,直至碰到第一个点,而这个点就是我们要找的最优点。

则不难发现,如果连续的三个点呈上凸状,则无论该直线斜率取多少,碰到的第一个点都不可能是中间这个点。

换句话说,就是中间这个点对答案没有任何贡献了。

于是就有一个策略:当我们要加入一个新的点时,比较当前点与前一个插入的点\(S_1\)、前一个插入的点与倒数第二个插入的点的斜率\(S_2\),如果\(S_1\le S_2\),则可将前一个插入的点弹出。

重复此操作,直至\(S_1>S_2\)或图上只剩一个点,然后将当前点插入。

如何求最优解

但是,这样一来,我们好像还是没能求出最优解。

此时又有两种操作方式:在凸包上二分单调队列维护最优解

对于某些问题,它可以确保决策单调性,即一个点如果当前不是最优解,则以后都不可能是最优解了。这样的问题可以直接用单调队列来维护最优解。

但有些问题却不一定满足这种性质,此时就需要在凸包上二分最优解了,但依然需要用单调队列来维护点集。

所以,如果你不会单调队列,最好赶紧去研究一下,然后再学习斜率优化\(DP\)。

几道例题

第一道例题: 【BZOJ2726】[SDOI2012] 任务安排

听说是入门题?洛谷上的弱化版可以直接单调队列维护,但是\(BZOJ\)上存在负数,需要在凸包上二分。

第二道例题: 【CF311B】Cats Transport

一眼看上去像是\(WQS\)二分,其实题意转换后可以直接斜率优化。

第三道例题: 【洛谷3648】[APIO2014] 序列分割

一开始觉得是区间\(DP\),结果一看数据范围,推了波性质,才发现其实可以用斜率优化\(DP\)来做。

动态规划专题(五)——斜率优化DP的更多相关文章

  1. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  2. 斜率优化dp(POJ1180 Uva1451)

    学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...

  3. HDU3507 print article【斜率优化dp】

    打印文章 时间限制:9000/3000 MS(Java / Others)内存限制:131072/65536 K(Java / Others) 总共提交:14521已接受提交:4531 问题描述 零有 ...

  4. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  5. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  6. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  7. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

  8. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  9. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

随机推荐

  1. 反射实现增删改查(DAO层)——插入数据

    先贴出代码,后续补充自己的思路.配置文件.使用方式: /** * 插入数据 */ @Override public void addObject(Object object, String table ...

  2. .NET ToString() format格式化字符串(常用)

    前言 我们平常会用到货币数据类型,尤其当我们计算金钱或者算数的时候经常会遇到保留几位小数,而且碰到日期格式问题的时候,经常不知道选择什么样的格式比较合适,下面我找了一部分常用的.NET ToStrin ...

  3. luogu 3806 【模板】点分治

    luogu 3806 [模板]点分治 给定一棵有n个点的树,有m个询问,每个询问树上距离为k的点对是否存在.树的权值最多不超过c.n<=10000,m<=100,c<=1000,K& ...

  4. game with probability problem

    两个人 A, B 取 n 枚石子,祂们轮流抛硬币 (A 先手),每次抛硬币,如果是正面,就取出一枚石子,否则什么都不做,然而 A, B 有一种超能力,在抛硬币前在意志中确定一面 (正面或反面),然后就 ...

  5. Java实现发送邮箱验证码/注册验证链接

    本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ...

  6. 我的省选 Day -5

    Day -5 时间载着我们,一天又一天,呼啸而过. 已经记不清今天是Day 负几了,总之还有不到一个星期就要去参加选拔赛了. 写一下今晚做NOI2009的心路历程. T1题意有点绕,但很快看出是个二分 ...

  7. C.0689-The 2019 ICPC China Shaanxi Provincial Programming Contest

    We call a string as a 0689-string if this string only consists of digits '0', '6', '8' and '9'. Give ...

  8. Proxy模式(代理[延迟]模式)

    Proxy?? Proxy是"代理人"的意思,它指的是代替别人进行工作的人.代理实际上就是使用委托的机制,在代理的过程中你可以做点其他的事情,然后再来执行被代理对象的代码. 知识储 ...

  9. Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……

    在IIS里启动设置好的网站(ASP.net网站),浏览器报如下错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault= ...

  10. QT LCDNumber使用

    新建一个QT工程 然后在cpp文件中写入代码 #include "hello.h" #include <qthread.h> #include <QVariant ...