Description
题目链接:BZOJ 1806
现有两个煤矿,每个煤矿都雇用一组矿工。采煤工作很辛苦,所以矿工们需要良好饮食。每当一辆食品车到达煤矿时,矿工们便会产出一定数量的煤。
$n$ 辆食品车分为三种类型:肉车,鱼车和面包车。矿工们喜欢变化的食谱。如果提供的食品能够不断变化,他们的产煤量将会增加。每当一个新的食品车到达煤矿时,矿工们就会比较这种新的食品和前两次(或者少于两次,如果前面运送食品的次数不足两次)的食品,并且:
- 如果这几次食品车都是同一类型的食品,则矿工们产出一个单位的煤。
- 如果这几次食品车中有两种不同类型的食品,则矿工们产出两个单位的煤。
- 如果这几次食品车中有三种不同类型的食品,则矿工们产出三个单位的煤。
预先已知食品车的类型及其被配送的顺序。食品车不能被拆分,每个食品车必须被全部送到一个或另一个煤矿。求出两个煤矿的产煤量的总和的最大值。
数据范围:$1\le n\le 10^5$
Solution
我们定义 $\text{DP}$ 状态 $f_{i,a,b,c,d}$:考虑完第 $i$ 个食品车,第一个煤矿前 $2$ 个食品车为 $a,b$,第二个煤矿前 $2$ 个食品车为 $c,d$。我们可以枚举写一个食品车 $x$ 到达哪个煤矿,直接转移即可。对于三个食品的贡献,我们可以写一个函数分类讨论。
注意:$\text{DP}$ 转移过程中,可能会遇到不合法的状态(比如 $a=0,b>0$,我们可以通过 $f$ 数组的值来判断状态是否合法)。
对于 $\text{DP}$ 的写法,可能递归写起来更简短。但是本题卡空间($18\text{MB}$)!只能写递推并使用滚动数组。
时间复杂度:$O(4^4\cdot n)$
Code
递推(MLE)
1 |
|
递推
1 |
|