题解 P7129 【「RdOI R1」冰淇淋游戏(play)】

· · 题解

前言

我是屑我是屑我是屑

我连多重背包01拆分都能写错

啊啊啊啊啊啊啊啊啊啊啊啊啊

思路

二合一题。

一个很显然的 dp,我用了记忆化搜索实现。显然对于一个区间 [l,r]最后选的数只能是 a_l 或者 a_r,而最后选的数会创造 r-l+1 的贡献。因此得到一个很显然的柿子:

dp_{i,j}=\max\{dp_{i+1,j}+a_i\times(j-i+1),dp_{i,j-1}+a_j\times (j-i+1)\}

显然直接二进制分组多重背包即可。

一个小坑:这里的多重背包需要将前面所有的都选至少一次,所以 dp 的时候要先强制选一次,再自由选。

for(int i=1; i<=mx; mx-=i,i<<=1) 做一次i个物品的完全背包;
做一次mx个物品的完全背包;
for(int i=1; i<=mx; i<<=1) if(i&mx) 做一次i个物品的完全背包;