func rob(nums []int) int {
n := len(nums)
if n == 1 {
return nums[0]
}
if n == 2 {
return max(nums[0], nums[1])
}
return max(_rob(nums[:n-1]), _rob(nums[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]
}
return max(_rob(nums[1:]), _rob(nums[:len(nums) - 1]))
}
func _rob(nums []int) int {
n := len(nums)
f0, f1 := 0 , nums[0]
for i := 1; i < n; i ++ {
f0, f1 = max(f0, f1), f0 + nums[i]
}
return max(f0, f1)
}