斜率优化DP学习笔记
来源:互联网 发布:海岛奇兵野人升级数据 编辑:程序博客网 时间:2024/04/28 06:59
对于一类状态转移方程可以写成
f[i]=min/max(a[i]*b[j]+G[j])+H[i](a、H是只和i有关的函数,b、G是只和j有关的函数)
且a和b至少有一个是单调的动态规划问题,我们可以通过数形结合来优化它。这类问题一般是要把一个线性序列分成若干段,暴力解决时间复杂度一般是O(n^2),如果a和b都是单调的,可以优化到O(n),如果只有一个是单调的,可以优化到O(nlog2n)。。
以取最小值为例,考虑对上面的方程进行变形,H[i]显然和选取最优的转移无关,可以先抹去,将方程变为-a[i]*b[j]+f[i]=G[j],将-a[i]看做斜率,f[i]看做截距,这就是一条直线,斜率一定,要求最小截距。将(b[j],G[j])看做j对应的点,那么我们要做的就是在i对应的状态转移点集中取截距最小的点,也就是拿一条斜率为-a[i]的直线从负无穷向上平移,第一个碰到的点。很显然,这个点一定在i对应点集的凸包上,而且我们是取最小值,所以一定是在下凸壳上,而且是这条直线与这个凸壳的切点。我们要维护这样一个凸壳,这可以用单调队列实现。
先考虑如何取出最优决策,设que是一个横坐标递增的具有下凸性的点集,取出队头的两个点,如果这两点的连线斜率<a[i](如下图)
显然直线不与凸壳相切,又因为斜率是单调(假设是增加)的,所以后面的直线肯定也不会切于这点,这时直接把队头弹出即可。一直这样维护直到队头两点斜率>=a[i],取出队头转移状态即可。
再考虑将点i插入凸壳中,设t1,t2为队尾的两个点,k(i,j)为i,j两点连线斜率,下凸壳的斜率显然是增加的,那么如果出现k(i,t1)<k(t1,t2)时,t1就没有存在的必要了,将它删除即可。
一直这样维护直到出现k(i,t1)>k(t1,t2),就保证了这个队列保存的点集的下凸性。。
有时候斜率和截距不是全单调的。
特殊处理:
横坐标单调:
二分凸包上的点,找到这样一个点x,使得
x和x左边的点的所在的直线斜率小于当前直线斜率
x和x左边的点的所在的直线斜率大于当前直线斜率
将直线插入,维护凸壳
斜率单调:
关于横坐标建立一棵Splay
然后在Splay中维护凸壳
- 斜率优化DP学习笔记
- 斜率优化dp 学习笔记
- 斜率优化DP学习笔记
- 斜率优化dp学习笔记
- 斜率优化 [学习笔记]
- 斜率优化学习笔记
- 学习笔记--斜率优化
- 斜率优化dp专题学习
- [HNOI2008]玩具装箱-DP斜率优化-单调队列-学习笔记
- CDQ分治与斜率优化DP——学习笔记
- hdu 3507 斜率优化dp 入门学习
- hdu 2993 斜率优化 dp 入门学习
- DP(斜率优化)
- 【斜率优化DP】Batch_Scheduling
- dp优化--斜率
- 斜率优化DP
- 斜率优化DP
- hdu3507斜率优化dp
- Unable to execute dex: Multiple dex files define 的解决方法
- HDOJ 3948 The Number of Palindromes 回文串自动机
- 强大的Django模型层插件:south详解
- Ubuntu 14.10 (64bit) +Qt5.4+Python3.4 +PyQt5.4.1+Eric6安装简介
- Mint17 中文输入法安装教程
- 斜率优化DP学习笔记
- Linux 下zip包的压缩与解压
- mysql基本操作(一)
- Http请求返回json解析java.lang.IndexOutOfBoundException错误
- Servlet 构造函数问题
- [HDOJ 1020]Encoding 字符串编码
- iOS开发--可以添加文字的CALayer
- Android studio使用笔记之编译.so文件
- SAP HANA HDBSQL命令