image.png
    f(1)=nums[1]
    f(2)=max(nums[1],nums[2])
    如果要打劫第n家,就必然不能打劫第n-1家,所以打劫第n家得到的钱一共是第n家的钱加上前n-2家获得的最多的钱,即:f(n-2)+nums(n),如果不打劫第n家,获得的最大收益就是f(n-1),两者我们要去较大的那个,所以动态转移方程是:
    f(n)=max(nums[n]+f(n-2),f(n-1))

    1. package main
    2. import "fmt"
    3. func max(a,b int)int{
    4. if a>b {
    5. return a
    6. }
    7. return b
    8. }
    9. func rob(nums []int) int {
    10. if len(nums)==0 {
    11. return 0
    12. }
    13. if len(nums)==1 {
    14. return nums[0]
    15. }
    16. dp := make([]int,len(nums))
    17. dp[0] = nums[0]
    18. dp[1] = max(nums[0],nums[1])
    19. maxVal := dp[1]
    20. for i:=2;i<len(nums);i++{
    21. dp[i] = max(dp[i-1],dp[i-2]+nums[i])
    22. maxVal = max(maxVal,dp[i])
    23. }
    24. return maxVal
    25. }
    26. func main() {
    27. fmt.Println(rob([]int{1,2,3,1}))
    28. fmt.Println(rob([]int{2,7,9,3,1}))
    29. }

    **