zoukankan      html  css  js  c++  java
  • [斜率优化DP]【学习笔记】【更新中】

    参考资料:

    1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf

    2.http://www.cnblogs.com/MashiroSky/p/6009685.html

    【一】

    对于一类转移方程:

    f[i]=max{a[i]*b[j]+c[i]+d[j]}

    a[i]和c[i]是开始求解前就知道常数,b[j]和d[j]知道f[j]后就知道有关

    可以使用斜率优化(不是这个形式就尽量往这个形式化


    {以下讨论不严格区分优于和不差于}

    【决策单调性】:

    对于两个转移j和k,设b[j]<b[k]

    假设j比k优或相等,把式子一化就变成了(注意bj-bk是负数啊,我对不起小新)

    -a[i]>=(d[k]-d[j])/((b[k]-b[j])

    这是一个斜率的形式,记slope(j,k)=(d[k]-d[j])/((b[k]-b[j])

    那么,-a[i]>=slope(j,k)时j转移比k转移优

    对于一个状态就可以判断两个转移谁更优了


    对于三个转移x y z ,bx<by<bz

    如果slope(x,y)<=slope(y,z),y一定不是任何一个状态的最优转移

    证明:

    假设y是p的最优转移,-a[p]<=slope(x,y)<=slope(y,z),所以z比y优


    然后,这不就是个上凸壳


    对于f[i]=min{a[i]*b[j]+c[i]+d[j]},只是把不等号反转而已,-a[i]<=slope(j,k)时j转移比k转移优,是一个下凸壳


    上下凸壳不是绝对的,有时候有迷之负数

    图形化的考虑,那很像直线方程对吧

    斜率形式+j的常数项是y,*j的常数项是x

     a[i]b[j]+f[i]=c[j]+d[i]

    连接


    【二】

    如何维护这个凸壳?

    以min为例,最优转移就是求第一点j,slope(j-1,j)<=-a,slope(j,j+1)>=-a,也就是斜率为-a的直线与这个凸壳的切点

    1.b单调,-a单调,单调队列

    • 插入前判断队首是不是最优转移,不是弹出队首
    • 凸壳只在一侧插入点且最优转移位置不断单向移动,插入时维护凸壳弹队尾

      

    2.b单调,-a不单调,队首不能弹,二分slope(q[j],q[j+1])满足一个条件的j作为答案

    3.

    4.

  • 相关阅读:
    Linux中rsync备份数据使用实例
    8个Date命令使用示例
    Linux中如何使用alias命令
    在LVM中恢复已删除的逻辑卷
    使用Dmidecode获取硬件信息使用实例
    Linux系统使用SSH登录之前如何显示横幅消息
    在Linux中修改打开文件数量限制的3种方法
    Linux中监控磁盘分区和使用情况的几个工具
    如何解决Ubuntu提示没有找到ifconfig命令
    Linux中ip命令的使用实例
  • 原文地址:https://www.cnblogs.com/candy99/p/6258792.html
Copyright © 2011-2022 走看看