funcrob(nums []int)int{
n :=len(nums)if n ==0{return0}// dp[i][0],代表第i个房子不取,到当前为止,偷到的最大金额// dp[i][1],代表第i个房子取,到当前为止,偷到的最大金额
dp :=make([][2]int,n)// 第一个房子不取,到第一个房子为止,偷盗最大金额为0
dp[0][0]=0// 第一个房子取,到第一个房子为止,偷盗最大金额为nums[0]
dp[0][1]= nums[0]for i :=1;i<n;i++{// 当前房子不取,到当前为止,偷盗的最大金额是上一个房子取或不取两者之间较大值
dp[i][0]=max(dp[i-1][0],dp[i-1][1])// 当前房子取,到当前为止,偷盗的最大金额是上一个房子没取加上当前房子值
dp[i][1]= dp[i-1][0]+nums[i]}// 最终最大金额为最后一个房子拿或不拿returnmax(dp[n-1][0],dp[n-1][1])}funcmax(x,y int)int{if x > y {return x
}return y
}
简化后
funcrob(nums []int)int{
n :=len(nums)if n ==0{return0}
unChoose,choose :=0, nums[0]for i :=1;i<n;i++{
unChoose,choose =max(unChoose,choose),unChoose+nums[i]}returnmax(unChoose,choose)}
再简化
funcrob(nums []int)int{// 假设第-1个房子没有钱
unChoose,choose :=0,0for i :=0;i<len(nums);i++{
unChoose,choose =max(unChoose,choose),unChoose+nums[i]}returnmax(unChoose,choose)}