突然在 U 群里爆出了这题,回想起了这道当时自己感觉挺有趣的一题,过来写篇题解。
题目描述
有三个长度为 n 的数列 {a1,a2,…,an},{b1,b2,…,bn},{c1,c2,…,cn},要满足约束
i=1∑naixi≤Pi=1∑nbixi≥P∀1≤i≤n,xi∈{0,1}
最小化
w=i=1∑ncixi
数据范围:n≤1000,P≤10000,∀1≤i≤n,0≤ai≤bi≤10000,∀1≤i≤n,0≤ci≤2×106。
题解
设 f(i,j) 表示确定了 x1∼i,且满足 ∑k=1iakxk≤j,∑k=1ibkxk≥j 时,∑k=1ickxk 的最大值。
则有转移方程:
f(i,j)=max{f(i−1,j),j−bi≤k≤j−aimax{f(i−1,k)+ci}}
显然可以用单调队列优化转移,时间复杂度为 O(nP),使用滚动数组可以将空间复杂度优化为 O(P)。
关键条件是 ai≤bi,没这个条件转移不成立。