码迷,mamicode.com
首页 > 其他好文 > 详细

单调队列优化多重背包

时间:2018-10-08 23:19:59      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:队列   rac   inline   math   span   转移   max   时间复杂度   复杂   

朴素的多重背包算法为
\[ f[i][j]=\max(f[i-1][j-kv_i]+kw_i)(kv_i\le j,k\le lim[i])? \]
时间复杂度为\(O(V\sum lim[])\)

先枚举i。设\(d=\lfloor\frac{j}{lim[i]}\rfloor\)\(r=j-lim[i]\cdot d\)。则上述转移可改写为
\[ f[i][j]=\max(f[i-1][r+kv_i]+(d-k)w_i) \]
\(d\)移到\(\max()\)外面,得

\[ f[i][j]=\max(f[i-1][r+kv_i]-kw_i)+dw_i \]
此时\(\max()\)中的项只与\(k\)有关了,可以用单调队列优化。复杂度为\(O(nV)\)

单调队列优化多重背包

标签:队列   rac   inline   math   span   转移   max   时间复杂度   复杂   

原文地址:https://www.cnblogs.com/utopia999/p/9757689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!