leetcode3180,題目網(wǎng)址如下:
https://leetcode.cn/problems/maximum-total-reward-using-operations-i/description/
原題:
給你一個整數(shù)數(shù)組?rewardValues澄耍,長度為?n睛蛛,代表獎勵的值蛋褥。
最初仍侥,你的總獎勵?x?為 0稽物,所有下標(biāo)都是?未標(biāo)記?的鸳惯。你可以執(zhí)行以下操作?任意次?:
從區(qū)間?[0, n - 1]?中選擇一個?未標(biāo)記?的下標(biāo)?i识腿。
如果?rewardValues[i]?大于?你當(dāng)前的總獎勵?x出革,則將?rewardValues[i]?加到?x?上(即?x = x + rewardValues[i]),并?標(biāo)記?下標(biāo)?i渡讼。
以整數(shù)形式返回執(zhí)行最優(yōu)操作能夠獲得的?最大?總獎勵骂束。
示例 1:
輸入:rewardValues = [1,1,3,3]
輸出:4
解釋:
依次標(biāo)記下標(biāo) 0 和 2,總獎勵為 4成箫,這是可獲得的最大值展箱。
示例 2:
輸入:rewardValues = [1,6,4,3,2]
輸出:11
解釋:
依次標(biāo)記下標(biāo) 0、2 和 1蹬昌』斐郏總獎勵為 11,這是可獲得的最大值。
提示:
1 <= rewardValues.length <= 2000
1 <= rewardValues[i] <= 2000
使用bitset優(yōu)化的dp代碼如下:
class Solution(object):
? ? def maxTotalReward(self, rewardValues):
? ? ? ? """
? ? ? ? :type rewardValues: List[int]
? ? ? ? :rtype: int
? ? ? ? """
? ? ? ? s = set(s)
? ? ? ? f = 1
? ? ? ? for v in sorted(s):
? ? ? ? ? ? f |= (f & ((1 << v) - 1)) << v?
? ? ? ? return f.bit_length() - 1