package main
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func rob1(nums []int) int {
n := len(nums)
dp := make([]int, n+1)
dp[1] = nums[0]
//相邻不能偷,从2开始
for i := 2; i <= n; i++ {
dp[i] = max(dp[i-2]+nums[i-1], dp[i-1])
}
return dp[n]
}
func rob2(nums []int) int {
if len(nums) == 0 {
return 0
}
if len(nums) == 1 {
return nums[0]
}
//环形可以拆成去掉头和去掉尾两个数组分别求最大值,然后取二者最大值
left := rob1(nums[1:])
right := rob1(nums[:len(nums)-1])
return max(left, right)
}
func rob3(root *TreeNode) int {
result := robTree(root)
return max(result[0], result[1])
}
func robTree(node *TreeNode) []int {
if node == nil {
return []int{0, 0}
}
//后序遍历左右中
left := robTree(node.Left)
right := robTree(node.Right)
//偷的情况
v1 := node.Val + left[0] + right[0]
//不偷的情况
v2 := max(left[0], left[1]) + max(right[0], right[1])
return []int{v2, v1}
}