• 斜率优化动态规划


    例题:HNOI2008 玩具装箱

    状态转移方程 clip_image002

    clip_image004clip_image006

    clip_image008

    设此时有决策a和b,其中a≤b

    若决策a优于决策b,则

    clip_image010

    分离变量,移项整理

    clip_image012

    clip_image014

    那么就意味着clip_image016时决策a比决策b优

    因为对于每个i来说,clip_image018是常量,所以clip_image016[1]是判断决策优劣程度的充要标准。

    那么现在考虑决策a,b,c,其中a≤b≤c

    clip_image020那么有什么结论呢?

    分情况讨论,因为clip_image022clip_image018[1]比较可以判定决策的优劣,所以分三种情况:

    clip_image024

    这意味着a比b优,b又比c优,所以a最优,应该选a,不能选b。

    clip_image026

    这意味着b比a优,c又比b优,所以c最优,应该选c,不能选b。

    clip_image028

    这意味着a比b优,c也比b优,所以不是a最优就是c最优,反正b不是最优,还是不能选b。

    综上所述,如果clip_image020[1],那么b一定不能选,所以就不用考虑b了。

    那么就维护一个单调队列:

    1、对于队尾:设a,b,c(a≤b≤c)是队尾的三个元素,那么判断clip_image030clip_image032,若clip_image020[2],就把c向前一位,也就是覆盖掉b。如此循环判断直到clip_image034或元素少于三个。

    2、对于队头:设a,b(a≤b)是队头的两个元素,因为clip_image016[2]clip_image018[2]是单调的(如果不单调那只能用平衡树维护了),所以clip_image036 那么就是说a对于以后的任意一个状态都不是最优决策,所以a出队。

    通过以上两种维护,每次转移i时选队头就是最优决策了。

    复杂度从O(n2)降到了O(n)。

  • 相关阅读:
    enumerate()
    列表
    pycharm下getpass.getpass()卡住
    字符编码
    while_else
    guess_age
    数据类型
    python发展史
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:JSP的基本原理
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Web应用和web.xml文件
  • 原文地址:https://www.cnblogs.com/loveidea/p/2878654.html
Copyright © 2020-2023  润新知