学习笔记·斜率优化 [HNOI2008]玩具装箱

\(qwq\)今天\(rqy\)给窝萌这些蒟蒻讲了斜率优化……大概是他掉打窝萌掉打累了吧顺便偷了\(rqy\)讲课用的图

\(Step \ \ 1\) 一点小转化

事实上斜率优化是专门用来处理这样一类\(dp\)式子的 \[dp_i = A_i + \max \limits _{j = 1}^{i -1}(B_j - C_j \times base_i)\]窝萌尝试把上式中的\(B_j\)\(C_j\)\(base_i\)等价成\(x_j\)\(y_j\)\(k_i\),并把它们丢到一个平面上,然后它萌就会变成一堆点\((x_j,y_j)\),画一条过他们的直线,类似于\[y - y_j = k_i(x - x_j)\]变换一下\[y = k_ix + (y_j + x_j)\]窝萌会发现,现在窝萌所求的不过是一条截距最大的直线而已。那么其实就是相当于求一个给定\(k\)意义下最靠上的点。

\(qwq\)那么窝萌不妨先减弱问题的不可做性,使其单调——令\(x\)单调增、\(k_i\)单调减。

那当窝萌在朴素\(DP\)遍历所有的\(k_i\)时,所得到的直线的轨迹应该是这样的:

轨迹正好是一个凸壳,并且你会发现它的轨迹正好是再绕着每个斜率下最优的点旋转。

\(rqy\)对此是这么解释的:

可以发现好多点是没有机会作为最优的点的。
形象⼀点的说,如果⼀个点的左边和右边某两个点在它上⽅“搭起”了⼀条线段,那么它就永远不会被选到。

而因为我们保证了\(x\)\(k\)的单调性,所以就我们可以比较方便的考虑“如何选取当前最优点”这个问题。我们考虑遇到一个新的点,是否把他加入最优解集合里面,其实质就是维护一个上凸壳。那么已知两个点\(A\)\(B\),现在遇到了新加入的点\(C\),此时有两种情况:

1、\(BC\)的斜率大于\(AB\)

这时我们需要抛弃\(B\),直接连接\(AC\)

2、\(BC\)

等着qwq

猜你喜欢

转载自www.cnblogs.com/pks-t/p/9418134.html