首页 > 其他 > 详细

斜率优化

时间:2020-07-02 13:05:07      阅读:47      评论:0      收藏:0      [点我收藏+]

斜率优化是一种用数据结构维护\(dp\)的某种单调性性质从而达到优化\(dp\)的效果。

抽象的说,斜率优化可通过维护一个上(下)凸壳优化形如\(f_i = min_{j=1}^{i-1}\{ f_j + g_{i,j}\}\)\(max\)同理)的转移方程。

例题 [ZJOI2007] 仓库建设

\(f_i\)为在第\(i\)个位置建造最后一个仓库的最小代价。

不难得出朴素的\(O(n^2)\)转移方程

\[f_i = min_{j = 0}^{i-1}\{f_j+x_i \times \sum_{k=j+1}^i p_k-\sum_{k=j+1}^ix_k\times p_k\}+c_i \]

换成前缀和的形式,令\(P_i=\sum_{j=1}^{i}p_i\), \(S_i=\sum_{j=1}^ix_i\times p_i\)

\[f_i=min_{j=0}^{i-1}\{ f_j+x_i\times(P_i-P_j)-S_i+S_j\}+c_i \]

若决策\(j\)优于决策\(k\),即

\[f_j+x_i\times(P_i-P_j)-S_i+S_j <f_k+x_i\times(P_i-P_k)-S_i+S_k \]

整理成斜率的形式

\[\frac{(f_j+S_j)-(f_k-S_k)}{S_j-S_k}<x_i \]

\(\because\)\(x_i\)单调递增,\(\therefore\)我们需要维护一个斜率单调递减的决策序列,即维护\(f_i\)函数的上凸壳。

使用单调队列维护即可,时间复杂度\(O(n)\)

Code

例题 CF311B Cats Transport

\(t_i\)为何时出发的人刚好接走它,\(s_i=\sum_{j=1}^it_i\)\(f_{i,j}\)\(i\)个人接走前\(j\)只猫的最小代价。

\[f_{i,j}=min_{k=0}^{j-1}\{ f_{i-1,k}+t_j\times (j-k) -S_j+S_k\} \]

先忽略第一维考虑第二维转移,是和上面那题类似的模式。

使用同样的套路比较决策点,然后得到斜率的形式

\[\frac{(f_{j}+S_j)-(f_k+S_k)}{j-k}<t_i \]

同样使用单调队列维护,转移时多枚举一维即可,时间复杂度\(O(mp)\)

Code

习题

HNOI2008 玩具装箱 TOY

APIO2010 特别行动队

USACO08MAR Land Acquisition

未完待续。。。

斜率优化

原文:https://www.cnblogs.com/ACMSN/p/13223768.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!