https://leetcode-cn.com/problems/delete-and-earn/
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
思路:
由于选择了一个值x后需要删除所有x-1和x+1,所以我们需要尽量取个数多的值作为x。这就可以转化为打家劫舍问题,即数组每一项上有不同的值,但是不能取相邻的值,怎样取能使值最大。
所以第一步应该统计出输入数组中每个值的个数,然后使用打家劫舍的状态方程进行动态规划。
dp[i] = max(dp[i - 2] + x*arr[i], dp[i - 1])
var deleteAndEarn = function(nums) {
let max = 0
for(let value of nums) {
max = Math.max(value, max)
}
let arr = new Array(max + 1).fill(0)
for(let value of nums) {
arr[value]++
}
return rob(arr)
};
function rob (arr) {
let prev1 = arr[0]
let prev2 = arr[1]
let result = prev2
for(let i = 2; i < arr.length; i++) {
result = Math.max(prev1 + i * arr[i], prev2)
prev1 = prev2
prev2 = result
}
return result
}