• sb的斜率优化笔记


    参考资料


    [HNOI2008]玩具装箱

    设 S[i] = Σ1≤i≤n (C[i] + 1), 设状态 dp[i] 表示装好前 i 个, 值为最小花费, 则转移为:
    dp[i] = min0≤j<i {dp[j] + (S[i]-S[j]-1-L)2} 。

    化简 (S[i]-S[j]-1-L)2 :将常量 L 加一, 变成 (S[i]-S[j]-L)2, 而后变成 S[i]2 + (S[j] + L)2 - 2S[i]S[j] - 2S[i]L。

    最后方程化简为 :dp[i] = min0≤j<i {dp[j] + S[i]2 + (S[j] + L)2 - 2S[i]S[j] - 2S[i]L} , 是 dp[i] = min/max {a(i) + b(j) + c(i) × d(j)} 的形式。

    看上去很 NB 的代数法

    考虑 dp[i] 的两个决策点 j1 < j2, 假设 j2 优于 j1, 可得:

    (-2S[i]S[j2]) + (dp[j2] + (S[j2] + L)2) ≤ (-2S[i]S[j1]) + (dp[j1] + (S[j1] + L)2)

    继续化简:

    -2S[i] (S[j2] - S[j1]) ≤ (dp[j1] + (S[j1] + L)2) - (dp[j2] + (S[j2] + L)2)

    由于 S[j2] > S[j1], 故可除:

    2S[i] ≥ (dfrac{(dp[j_2]+(S[j_2]+L)^2) - (dp[j_1]+(S[j_1]+L)^2)}{S[j_2]-S[j_1]})

    若有 j2 > j1, 就可以通过判断这个东西是否成立来判断 j2 这个决策点是不是优于 j1 这个决策点。

    然后设 X(i) = S[i], Y(i) = dp[i] + (S[i] + L)2, 再设 P(i) = (X(i), Y(i)) (平面直角坐标系上的一个点), 问题就是在平面直角坐标系上的一个斜率判定问题。

    考虑一个只有三个点的上凸包, 可知不论怎样,用上面那个结论可观测到的有效决策集合是原决策集合的下凸包。具体推理见参考资料

    线性规划法

    复习下形式:dp[i] = min/max {a(i) + b(j) + c(i) × d(j)}

    这种线性规划法就是把某个决策点 j 的转移,即 dp[i] = a(i) + b(j) + c(i) × d(j), 在某个来自西方的神秘二维结构(即平面直角坐标系)上以某种方式展开, 然后转化为在这个二维结构上的最优化问题。

    具体地, 先将除了 dp[i] 的东西以 ' 标示之, 记为常量:

    dp[i] = a(i)' + b(j) + c(i)' × d(j)

    然后将式子化成:

    b(j) = -c(i)' × d(j) - a(i)' + dp[i]

    然后现在的问题就是将所有决策点看成 (d(j),b(j)), 然后把一个斜率为 -c(i)' 的直线对齐每个点, 找出最小的截距。

    发现上凸包是不存在的, 维护决策点的下凸包即可。

    两种方法的评价

    线性规划 >>> 代数法,降维打击!

  • 相关阅读:
    Android网络开发的那些事儿
    first day to Ruby on rails
    [转]Windows SDK与DirectX SDK集成
    Windows8
    [转]MPI--MPI+VS2010 配置及编译
    codeblock添加头文件路径和静态库路径
    汇编笔记1:debug
    Eclipse Error
    Android SDk 离线安装方法
    求一程序员合租,回龙观东大街地铁站十分钟,精装次卧2000,无需押金,一共两家
  • 原文地址:https://www.cnblogs.com/tztqwq/p/14289360.html
Copyright © 2020-2023  润新知