Problem
You are given an integer array nums. You want to maximize the number of points you get by performing the following operation any number of times:
- Pick any nums[i] and delete it to earn nums[i] points. Afterwards, you must delete every element equal to nums[i] - 1 and every element equal to nums[i] + 1.
Return the maximum number of points you can earn by applying the above operation some number of times.
Algorithm
Dynamics Programming (DP). F(n) = max(F(n-1), F(n-2)) {if nums[n] exists} else F(n) = F(n-1).
Code
python3
class Solution:
def deleteAndEarn(self, nums: List[int]) -> int:
max_value = 0
for num in nums:
if max_value < num:
max_value = num
flag = [0] * (max_value + 1)
for num in nums:
flag[num] += 1
ans = [0] * (max_value + 1)
ans[1] = flag[1]
for i in range(2, max_value+1):
ans[i] = ans[i-1]
if i > 1 and flag[i] and ans[i] < ans[i-2] + i * flag[i]:
ans[i] = ans[i-2] + i * flag[i]
return max(ans[max_value], ans[max_value-1])