用了一堂半的课才彻底搞懂。其他神犇写的博客或多或少有点小bug,所以orzzz不才斗胆重新写一个。

里面大量穿用其他神犇的原话,就不逐一标明出处了。

引用资料 Accept的博客 MathonL的博客

首先是最经典的题的题面。

HDU 3507,很适合的一个入门题。

大概题意就是要输出$N$个数字$a[N]$,输出的时候可以连续连续的输出,每连续输出一串,它的费用是 “这串数字和的平方加上一个常数$M$”。

我们设$dp[i]$表示输出到$i$的时候最少的花费,$S[i]$表示从$a[1]$到$a[i-1]$的数字和。注意这里为了方便起见前缀和与一般的有区别。

则有:$dp[i]=min \left\{ dp[j]+(S[i+1]-S[j])^2+M \right\} (j<i)$

复杂度显然是$O(n^2)$的。对于$500000$的$n$显然过不了。那么我们想,能否在$O(1)$时间内找到所有转移里最优的那个呢?

我们假设在求解$dp[i]$时,存在$j,k(j>k)$使得从$j$转移比从$k$转移更优,那么需要满足条件:

$dp[j]+(S[i+1]-S[j])^2+M<dp[k]+(S[i+1]-S[k])^2+M$

展开上式

$dp[j]+S[i+1]^2-2S[i+1]S[j]+S[j]^2+M<dp[k]+S[i+1]^2-2S[i+1]S[k]+S[k]^2+M$

移项并消去再合并同类项得

$dp[j]-dp[k]+S[j]^2-S[k]^2<2S[i+1](S[j]-S[k])$

把$S[j]-S[k]$除过去,得到

$\frac{dp[j]-dp[k]+S[j]^2-S[k]^2}{S[j]-S[k]}<2S[i+1]$

我们设$f[x]=dp[x]+S[x]^2$,就化成了

$\frac{f[j]-f[k]}{S[j]-S[k]}<2S[i+1]$

即当$(j>k)$时,若$\frac{f[j]-f[k]}{S[j]-S[k]}<2S[i+1]$,则$j$对更新$dp[i]$比$k$更新$dp[i]$优。

休息一下qwq。这个东西好像斜率。

当一个数的$dp$值求完了,它的$f$值也跟着确定,我们就可以在空间中绘制出点$(S[i],f[i])$。这个点代表已经求出$dp$值的一个点。

当我们要求解$dp[t]$时,如果可用的集合里存在这样三个点,位置关系如图所示:

那么显然

$\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}$

这时候他们和$2S[t+1]$的关系有3种:

·$\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}>2S[t+1]$

那么$j$比$i$优,$k$比$j$优。

·$\frac{f[j]-f[k]}{S[j]-S[k]}>2S[t+1]>\frac{f[i]-f[j]}{S[i]-S[j]}$

那么$i$比$j$优,$k$比$j$优。

·$2S[t+1]>\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}$

那么$i$比$j$优,$j$比$k$优。

综上,不管什么样的$S[t+1]$,从$j$转移都不会是最佳方案。那么用一个数据结构维护一个凸包(下凸),每加入一个点就删去一些点,使其维持凸包的形态。最优转移一定在这个凸包中。

但还是不能$O(1)$对吧。在凸包里,谁又是最最优呢?

首先一定数据结构里的凸包一定会是这样的:

假设$\overrightarrow{ji}$的斜率$>2S[t+1]$且$\overrightarrow{kj}$的斜率$<2S[t+1]$从图形特点我们可以发现$j$点比所有比$k$小的点都优,比所有比$i$大的也优。所以对于我们二分查找斜率比$2S[t+1]$小的编号最大的点,就是最优的转移点。由于$S[i]$也满足单调性,我们还可以直接维护一个单调队列就能解决这个问题。

推广一下,如果不等式右侧不是像$S[i+1]$这样的单调函数,二分就好了。

所有小于等于的情况我都没提,想一想就知道了。重要的是思想啊对不对~

(我会说我一道斜率优化题都没做就写了这篇博客吗


upd1:

光会思想没有用啊,,,边界条件的处理很蛋疼的说

还是要自己写几遍qwq

upd2:

更正了一个bug,由@Duan2baka发现。不好好女装居然来看我这篇菜鸡博客。

upd3:

dp式子都写错了。。。感谢@自为风月马前卒指正

upd4:

我这bug也够多了哈。。感谢@belief01指正

upd5:

又改了一处不严谨的地方,感谢@ToRe

如果影响大家曾经的阅读深表歉意~虽然不是老师,但是千万不要误人子弟啊。。

斜率优化dp学习的更多相关文章

  1. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

  2. 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy

    本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...

  3. hdu3507Print Article(斜率优化dp)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

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

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

  5. 动态规划专题(五)——斜率优化DP

    前言 斜率优化\(DP\)是难倒我很久的一个算法,我花了很长时间都难以理解.后来,经过无数次的研究加以对一些例题的理解,总算啃下了这根硬骨头. 基本式子 斜率优化\(DP\)的式子略有些复杂,大致可以 ...

  6. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  7. 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱

    斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...

  8. 一本通提高篇——斜率优化DP

    斜率优化DP:DP的一种优化形式,主要用于优化如下形式的DP f[i]=f[j]+x[i]*x[j]+... 学习可以参考下面的博客: https://www.cnblogs.com/Xing-Lin ...

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

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

随机推荐

  1. 后台curl网络请求

    <?php //前端进行网络请求  ajax //后台进行网络请求用到两种方式  curl   socket //进行网络请求的步骤 //1.初始化一个curl //2.对curl进行配置 // ...

  2. 安装和使用PhantomJS

    一.安装PhantomJS(linux环境安装) 将PhantomJS下载在/usr/local/src/packet/目录下(这个看个人喜好) 操作系统:CentOS 7 64-bit 1.下载地址 ...

  3. python基础-第十一篇-11.1JavaScript基础

    JavaScript是一门解释型编程语言,主要是增强html页面的动态效果 JavaScript是有三部分组成:ECMAScript.BOM.DOM 单行注释//   多行/*   */(必须是scr ...

  4. MySQL数据库(二)

    事务 数据库开启事务命令 #start transaction 开启事务 #Rollback 回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚到上一次co ...

  5. MySQL - 查询今天的数据(以及昨天、本月、上个月、今年...) 查询Datetime 时间的数据

    1,查询当天(今天)的数据 1 SELECT * FROM `order` WHERE TO_DAYS(order_time) = TO_DAYS(NOW()) 2,查询昨天的数据 1 SELECT  ...

  6. 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见

    订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题. 在解释如何解决订单并发问题之前,需要先了解一下什么是数据库的事务.(我用的是mysql数据 ...

  7. Python3.6编译安装以及python开发之virtualenv与virtualenvwrapper

    Python3.6编译安装 下载python源码包 先到安装目录 cd /opt 下载源码包 wget https://www.python.org/ftp/python/3.6.2/Python-3 ...

  8. 项目中遇到的问题, ftp等

    1:ftp 上传文件时的权限问题,需要将上传主目录下的文件权限设置为,这样用户就具有上传,操作,删除等权限 chmod  777 2:  当访问ftp时,出现以下提示.说明需要用户名和密码,这是在ft ...

  9. PAT 1116 Come on! Let's C [简单]

    1116 Come on! Let's C (20 分) "Let's C" is a popular and fun programming contest hosted by ...

  10. NOSQL概念入门

    一.NOSQL概念 随着大数据时代的到来,分布式存储得到了快速发展,其中比较受欢迎的,主要以key-value键值对存储的非关系型数据库进入了大家的视野. NOSQL的全称是Not Only Sql, ...