func deleteAndEarn(nums []int) int {
maxVal := 0
for _, val := range nums {
maxVal = max(maxVal, val)
}
count := make([]int, maxVal+1)
for _, val := range nums {
count[val] += val
}
return dp(count)
}
func dp(nums []int) int {
first, second := nums[0], max(nums[0], nums[1])
for i := 2; i < len(nums); i++ {
first, second = second, max(first+nums[i], second)
}
return second
}
二刷
func deleteAndEarn(nums []int) int {
maxVal := 0
n := len(nums)
for i := 0; i < n; i ++ {
maxVal = max(maxVal, nums[i])
}
src := make([]int, maxVal + 1)
for i := 0; i < n; i ++ {
src[nums[i]] += nums[i]
}
f0, f1 := 0, src[0]
for i := 1; i <= maxVal; i ++ {
f0, f1 = max(f0, f1), f0 + src[i]
}
return max(f0, f1)
}