CF1428G2 Lucky Numbers (Hard Version) 解题报告
CF1428G2 Lucky Numbers (Hard Version) 解题报告
非常棒的一个背包 dp 题目。
需要一些观察和注意,然后转化成普通的多重背包。
第一个观察:可以发现,\(0\) 也可以作为幸运数字。
第二个观察:改变两个数字相同位置上的数,只要这个数位上的和不变,对答案没有任何影响。
有了这两个观察之后,我们发现,对于所有数的同一个数位,最多只会有一个非幸运数字的数。如果有两个 \(a,b\) 都不是幸运数字,我们可以通过调整让他变成一个是幸运数字,一个不是。
调整方法是这样的:
- 如果 \(a+b>9\),让一个变成 \(9\),另一个变成 \(a+b-9\),即可。
- 否则,让一个变成 \(0\),另一个变成 \(a+b\) 就行。
之后,我们可以通过交换两个数的同一个数位,把所有非幸运数字的全部叠到一个数上。
所以我们得到 一个结论:
我们可以构造出一种有 \(k-1\) 个数每个数位都是由 \(0,3,6,9\) 组成的,有一个数是平凡的方案使得它的幸运值是最大的,也就是这是最优解之一。
接下来考虑多重背包,设 \(f_a\) 表示各个数字和为 \(a\) 的最大幸运值。
先特殊处理了平凡的数,从 \(0\) 到 \(999999\) 枚举一次,让 \(f_i=\sum_{x} [i_x \% 3=0] \frac{x}{3} F_x\)。
第三个观察: 如果一个数位填 \(6\),那么相当于填两个 \(3\),如果填 \(9\) 就相当于填 \(3\) 个 \(3\)。
之后,对于每一个数位,我们全部一起做,只需要考虑都是幸运数字就行了。
接下来相当于是有 \((k-1)\) 个数字的这个数位都可以填 \(0~3\) 个 \(3\),所以有 \(3(k-1)\) 个这样的物品,每一个重量是 \(3\times 10^{这是第几位}\),价值是 \(F_{这个数位}\)。
那么显然可以用二进制分组优化一下这个多重背包,然后就做完了。

浙公网安备 33010602011771号