給你一個整數數組 nums ,你可以對它進行一些操作。
每次操作中,選擇任意一個 nums[i] ,刪除它并獲得 nums[i] 的點數。之后,你必須刪除每個等于 nums[i] - 1 或 nums[i] + 1 的元素。
開始你擁有 0 個點數。返回你能通過這些操作獲得的最大點數。
示例 1:
輸入:nums = [3,4,2]
輸出:6
解釋:
刪除 4 獲得 4 個點數,因此 3 也被刪除。
之后,刪除 2 獲得 2 個點數。總共獲得 6 個點數。
解題思路
代碼分為兩個部分
- 統計每個元素出現的次數(方便計算刪除元素后的得分),并且找出最大值(為了縮小dp數組的長度)
for _, num := range nums {cnt[num]++if num>max{max=num}}
- 狀態轉移
dp[i][0]代表當前元素是i,并且不刪除該元素。因此前一個元素可以是被刪除元素,也可以不是
dp[i][1]代表當前元素是i,需要刪除該元素。因此前一個元素必須不為刪除元素(因為如果前一個元素是刪除元素,該元素已經被刪除掉了),并且加上刪除后的得分
for i := 1; i <= max; i++ {dp[i][0]=MaxV(dp[i-1][0],dp[i-1][1])dp[i][1]=dp[i-1][0]+i*cnt[i]}
代碼
func MaxV (a int,b int) int {if a>b{return a}else {return b}
}func deleteAndEarn(nums []int) int {cnt:=make([]int,10008)max:=-1for _, num := range nums {cnt[num]++if num>max{max=num}}dp:=make([][2] int,max+1)for i := 1; i <= max; i++ {dp[i][0]=MaxV(dp[i-1][0],dp[i-1][1])dp[i][1]=dp[i-1][0]+i*cnt[i]}return MaxV(dp[max][0],dp[max][1])
}