func rob(nums []int) int {
n := len(nums)
f := make([][]int, n)
for i := 0; i < n; i ++ {
f[i] = make([]int, 2)
}
f[0][1] = nums[0]
for i := 1; i < n; i ++ {
f[i][0] = max(f[i - 1][1], f[i - 1][0])
f[i][1] = f[i - 1][0] + nums[i]
}
return max(f[n - 1][0], f[n - 1][1])
}
滚动数组优化
byd,这几把dp空间复杂度都O(1)了,好虾仁
func rob(nums []int) int {
n := len(nums)
f := make([][]int, 2)
for i := 0; i < 2; i ++ {
f[i] = make([]int, 2)
}
f[0][1] = nums[0]
for i := 1; i < n; i ++ {
f[i%2][0] = max(f[(i - 1)%2][1], f[(i - 1)%2][0])
f[i%2][1] = f[(i - 1)%2][0] + nums[i]
}
return max(f[(n - 1)%2][0], f[(n - 1)%2][1])
}
无需二维数组的做法
虽然这种看起来还算优雅吧,但是在计算路径的时候可能不是太友好。
func rob(nums []int) int {
n := len(nums)
if n == 0 {
return 0
}
if n == 1 {
return nums[0]
}
f := make([]int, n + 2)
nums[1] = max(nums[1], nums[0])
for i := 2; i < n + 2; i ++ {
f[i] = max(f[i - 1], f[i - 2] + nums[i - 2])
}
return f[n + 1]
}