
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))
package mainimport "fmt"func max(a,b int)int{if a>b {return a}return b}func rob(nums []int) int {if len(nums)==0 {return 0}if len(nums)==1 {return nums[0]}dp := make([]int,len(nums))dp[0] = nums[0]dp[1] = max(nums[0],nums[1])maxVal := dp[1]for i:=2;i<len(nums);i++{dp[i] = max(dp[i-1],dp[i-2]+nums[i])maxVal = max(maxVal,dp[i])}return maxVal}func main() {fmt.Println(rob([]int{1,2,3,1}))fmt.Println(rob([]int{2,7,9,3,1}))}
**
