力扣刷题记录
dp bitset优化
3181. 执行操作可获得的最大总奖励 II
思路
这一题和昨天的每日一题是一样的,唯一的区别就是题目的数量级
这个量级就让题目从中等变成了困难题,需要进行优化才可以通过所有测试用例
并没有思路,只能查看题解
灵神讲解的很清楚明白
这题需要去掉背包问题的第一个维度,并用 bitset 优化
取低位 然后左移
// mask = (1 << val) - 1
// f = f | ( f & mask ) << val // 取低位左移
这个图 取低位
然后左移 直接取或 即可
太强了!!!
代码
func maxTotalReward(rewardValues []int) int {
sort.Ints(rewardValues)
n := len(rewardValues)
if n >= 2 && rewardValues[n-2] == rewardValues[n-1] - 1{
return 2 * rewardValues[n-1] - 1
}
f0, f1 := big.NewInt(1), big.NewInt(0)
for _, val := range rewardValues{
mask, one := big.NewInt(0), big.NewInt(1)
mask.Sub(mask.Lsh(one, uint(val)), one)
f0.Or(f0, f1.Lsh(f1.And(f0, mask), uint(val)))
// mask = (1 << val) - 1
// f = f | ( f & mask ) << val // 取低位左移
}
return f0.BitLen() - 1
}