1. 程式人生 > >單調隊列優化多重背包

單調隊列優化多重背包

splay pla clas display line lin 單調隊列優化 floor 有關

樸素的多重背包算法為
\[ 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)\)

單調隊列優化多重背包