class
Solution {
public
:
int
deleteAndEarn(vector<
int
>& nums) {
sort(nums.begin(), nums.end());
vector<
int
> memo(nums.size(), -1);
return
dfs(nums, 0, memo);
}
private
:
int
dfs(
const
vector<
int
>& nums,
int
index, vector<
int
>& memo){
if
(index >= nums.size())
return
0;
if
(memo[index] != -1)
return
memo[index];
int
i1;
for
(i1 = index; i1 < nums.size() && nums[i1] == nums[index]; i1 ++);
int
i2;
for
(i2 = i1; i2 < nums.size() && nums[i2] == nums[index] + 1; i2 ++);
int
res1 = nums[index] * (i1 - index) + dfs(nums, i2, memo);
int
res2 = dfs(nums, i1, memo);
return
memo[index] = max(res1, res2);
}
};