6007. 数组的最大与和
2022-02-13 15:36:00
# leecode
Link
https://leetcode-cn.com/problems/maximum-and-sum-of-array/
Meaning
- 长度为 $n$ 的数组 $nums$
- 有 $numSlots$ 个篮子,编号 $1…numSlots$
- $nums$ 中每个数字都需要放入篮子中
- 每个篮子最多放两个数字
- 每个篮子的权值是(篮子中的每个数字与篮子编号的与操作之和)
- 一种分配方式的权值和是(所有篮子权值之和)
- 求最大的权值和
- $n == nums.length$
- $1 <= numSlots <= 9$
- $1 <= n <= 2 * numSlots$
- $1 <= nums[i] <= 15$
Solution
- 每个篮子最多 $2$ 个整数,可看作 $2*numsSlots$ 个篮子
- 数据范围小,可以状压 $DP$
- 篮子的编号不能变,nums中的位置信息不重要
- 二进制数 $x$ 表示 $2*numSlots$ 个篮子是否被占有
- 设 $i$ 的二进制中的 $1$ 的个数为 $c$,定义 $f[i]$ 表示将 $nums$ 的前 $c$ 个数字放到篮子中,且放了数字的篮子集合为 $i$ 时的最大与和。初始值 $f[0]=0$
- 枚举空蓝子的位置 j,对应篮子编号为 j/2+1
- f[i+2^j] = max( f[i+2^j], f[i] + (j/2+1)&nums[c] )
- 当然倒过来转移也可行
- f[i] = max( f[i], f[i-2^j] + (j/2+1)&nums[c-1] )
Code
1 | import static java.lang.Math.max; |