Description
You are given an integer array rewardValues of length n, representing the values of rewards.
Initially, your total reward x is 0, and all indices are unmarked. You are allowed to perform the following operation any number of times:
- Choose an unmarked index
ifrom the range[0, n - 1]. - If
rewardValues[i]is greater than your current total rewardx, then addrewardValues[i]tox(i.e.,x = x + rewardValues[i]), and mark the indexi.
Return an integer denoting the maximum total reward you can collect by performing the operations optimally.
Β
Example 1:
Input: rewardValues = [1,1,3,3]
Output: 4
Explanation:
During the operations, we can choose to mark the indices 0 and 2 in order, and the total reward will be 4, which is the maximum.
Example 2:
Input: rewardValues = [1,6,4,3,2]
Output: 11
Explanation:
Mark the indices 0, 2, and 1 in order. The total reward will then be 11, which is the maximum.
Β
Constraints:
1 <= rewardValues.length <= 20001 <= rewardValues[i] <= 2000
Solution
Python3
class Solution:
def maxTotalReward(self, A: List[int]) -> int:
A = sorted(set(A))
N = len(A)
res = 0
MAX = A[-1]
@cache
def go(index, total):
if index == N: return total
res = total
res = max(res, go(index + 1, total))
if A[index] > total:
if total + A[index] < MAX:
res = max(res, go(index + 1, total + A[index]))
else:
res = max(res, total + A[index])
return res
return go(0, 0)