斜率优化dp

f i = min ⁡ ( a j − j × i ) f_i=\min(a_j - j \times i) fi=min(ajj×i)

考虑变成点对 ( j , a j ) (j,a_j) (j,aj),则 f i = Y j − X j i f_i=Y_j-X_ji fi=YjXji

i = k , f i = b i=k, f_i=b i=k,fi=b,得 b = Y j − X j k b=Y_j-X_jk b=YjXjk,即 Y j = X j k + b Y_j=X_jk+b Yj=Xjk+b

我们希望 b b b 尽量小,也就是截距尽可能小,即下图红色部分

斜率优化dp_第1张图片

对于点对,我们维护凸壳

斜率优化dp_第2张图片

可以发现,在第一个切的地方我们可以取截距最小

维护凸壳采用的是单调队列,我们维护两点之间斜率递增

如果新加入的点会使斜率递减,则把队尾的点pop掉

然后我们就可以二分 / 决策单调性了

你可能感兴趣的:(斜率优化)