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 main
import "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}))
}
**