描述
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
分析
转化成打家劫舍4的问题,建一个长是10001的数组,把原来的元素作为下标值是元素出现的次数或者元素的累加和。
最后按照打家劫舍4的解法用动态规划求解。
class Solution {
public int deleteAndEarn(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
int[] dp = new int[10001];
for (int num : nums) {
dp[num] += num;
}
int fir = dp[0], sec = dp[1], tmp = 0;
for (int i = 2; i < dp.length; i++) {
tmp = Math.max(sec,dp[i]+fir);
fir = sec;
sec = tmp;
}
return Math.max(fir,sec);
}
}