package main import "fmt" func _rob(arr []int) int { dp := make([]int, len(arr)) dp[0] = arr[0] //相当于最前面还有一个房子价值=0 dp[1] = max(arr[0], arr[1]+0) for i := 2; i < len(arr); i++ { dp[i] = max(dp[i-2]+arr[i], dp[i-1]) } return dp[len(arr)-1] } func rob(arr []int) int { if len(arr) == 1 { return arr[0] } if len(arr) == 2 { return max(arr[0], arr[1]) } return max(_rob(arr[:len(arr)-1]), _rob(arr[1:])) } func max(a, b int) int { if a > b { return a } return b } /* * 假设数组 nums 的长度为 n。 如果不偷窃最后一间房屋,则偷窃房屋的下标范围是 [0,n−2]; 如果不偷窃第一间房屋,则偷窃房屋的下标范围是 [1,n−1] 输入:nums = 1 2 3 1 输出:4 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。 输入:1 3 1 3 100 输出:103 */ func main() { //arr := []int{1, 3, 1, 3, 100} var num int fmt.Scanln(&num) arr := make([]int, num) for i := 0; i< num; i++{ fmt.Scan(&arr[i]) } fmt.Println(rob(arr)) }