zoukankan      html  css  js  c++  java
  • 斜率优化

    很久之前一直觉得斜优很难理解,,,今天再看发现好像是挺好理解的。

    不过如果x不单调就要用splay或者cdq维护了,,,,依旧很恶心。、

    先讲最基础的斜优吧,不单调的以后再填坑。

    先来看一道例题:CF311B Cats Transport 斜率优化DP

    当我们得到DP方程$f[i][j] = f[i - 1][k] + (j - k) t_{j} - (s[j] - s[k])$之后,我们对式子进行转化,

    将只跟k相关的放在式子左边,把剩余部分放在式子右边,同时在式子右边把只跟k相关的放在一起,把既跟j有关又跟k有关放在一起。

    $$f[i][j] = f[i - 1][k] + (j - k) t_{j} - (s[j] - s[k])$$
    $$Rightarrow f[i][j] = f[i - 1][k] + jt_{j} - kt_{j} - s[j] + s[k]$$
    $$Rightarrow -s[k] - f[i - 1][k] = -kt_{j} + jt_{j} - s[j] - f[i][j]$$
    $$Rightarrow s[k] + f[i - 1][k] = t_{j}k - jt_{j} + s[j] + f[i][j]$$

    我们可以假设$y = s[k] + f[i - 1][k], x = k, K = t_{j}, b = -jt_{j} + s[j] + f[i][j]$。

    那么这就是一个$y = kx+b$的形式的式子。

    我们可以把所有的决策点都看作一个二维平面上的点(x, y),因为我们只需要有(x, y)就可以知道这个点对当前决策的所有贡献。

    而跟当前状态有关的只有k和b。观察到我们要求f[i][j]最小,就是要求b最小(因为b的其他部分是固定的)。

    而k是固定的,于是我们可以看做一个二维平面上有很多点,我们要用一根斜率为k的直线覆盖某个点,使得b最小。

    显然这个使得b最小的点会出现在所有点的下凸包上,于是我们考虑维护一个下凸包,然后每次在这个凸包上寻找最优决策点。

    相当于用一条斜率为K的直线靠近这个凸包,第一个碰到的点就是最优决策点。

    因为K是递增的,所以在下凸包上第一个被碰到的点是单调递增的,又因为x递增,所以可以直接用单调队列维护。

    感觉讲得有点乱,,,NOIP之后再来完善吧

    emmm。。。好像咕了,,,不想写了,,,懒得画图

  • 相关阅读:
    巴洛克式和哥特式的区别
    推荐阅读书籍,是时候再行动起来了。
    AtCoder ABC 159F Knapsack for All Segments
    AtCoder ABC 159E Dividing Chocolate
    AtCoder ABC 158F Removing Robots
    AtCoder ABC 158E Divisible Substring
    AtCoder ABC 157F Yakiniku Optimization Problem
    AtCoder ABC 157E Simple String Queries
    AtCoder ABC 157D Friend Suggestions
    AtCoder ABC 156F Modularness
  • 原文地址:https://www.cnblogs.com/ww3113306/p/9936451.html
Copyright © 2011-2022 走看看