容易发现这是一个完全背包问题,我们设状态 fi,j 表示前 i 个物品使用了 j 个容量的最大价值。
容易写出转移方程式:fi,j=⌊jw⌋maxk=0fi−1,j−kw+kv−k2
直接 dp 是 O(n3)。考虑对这个 dp 进行优化。
上面的方程容易写成滚动数组的形式。不妨设上一维状态为 g,这一维为 f。
Solution 1
将后面的 kv−k2 记为 T(k),则一段区间 [l,r] 价值记为 w(l,r),则 w(l,r)=T(r−l+1)。发现若对于决策点 a,a+1,b,b+1,始终满足 w(a,b)+w(a+1,b+1)≥w(a,b+1)+w(a+1,b)。
将 j 按对 w 取模后的值分类后使用决策单调性优化即可。时间复杂度 O(n2logn)。
Solution 2
同样对 j 按对 w 取模后的值分类。改写 dp 式子:fi=maxgj+(i−j)v−(i−j)2。
对式子拆分:fi=gj+iv−jv−i2−j2+2ij
移项得 gj−jv−j2=−2ij+i2+fi−iv
容易发现这是斜率优化的形式,且 k=−2i 为单调的, x=i 也是单调的,使用单调队列可以优化到 O(n2)。
决策单调性:code
斜率优化:code
还是建议写决策单调性,码量小细节少。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】