给定 n 个单调不降的数组,初始计数器 sum=0。你需要进行 k 次操作,每次选择某个数组的第一个未被删除的元素 x,将 sum 加上 x,然后将 x 从这个数组中删去。最大化 sum。
1≤n,k≤3000,所有数组长度之和不超过 106,值域 [0,108]。
首先最多只有一个数组不是全选的,因为若存在两个数组 a,b 不是全选,假设选择了 a[1,x] 和 b[1,y],则一定有 ax+1<by,否则可以撤销 y 选 x+1,那么由于 ax<ax+1,ay<ay+1 故一定有 ax<by+1,所以此时撤销 x 选 y+1 是优的,矛盾。
那么问题变成了扣掉一个物品的 01 背包,这个是经典问题,可以做到 O(nklogn)。具体的,考虑类似线段树一样分治,处理区间 [l,r] 的时候先加入 [l,mid] 中的物品,递归右半边;再撤销掉 [l,mid] 中的物品(通过开桶记录加入前的状态实现),递归左半边。这样递归到单点的时候就求出了答案。
时间复杂度是 T(n)=O(nk)+2T(2n)=O(nklogn) 的。