题目

26年7月16日(首刷看解)
Go
func rob(nums []int) int {
if len(nums)<=1{
return nums[0]
}
res1:=rob1(nums[1:])
res2:=rob1(nums[:len(nums)-1])
return max(res1,res2)
}
func rob1(nums []int) int {
//dp[n],表示打劫前n间房的最高金额,对应下标[0,n-1]
dp:=make([]int,len(nums)+1)
dp[0]=0
dp[1]=nums[0]
for i:=2;i<=len(nums);i++{
dp[i]=max(dp[i-1],dp[i-2]+nums[i-1])
}
return dp[len(nums)]
}
思路
好题,我没想出来,看了题解觉得比较妙
思路就是如下图


这一道题不允许的就是出现首尾同时被打劫的情况,那么可以分成这三种情况考虑(考虑不是必打劫),那么情况2包含于情况1和3,所以只保留情况1和3,此时其实注意到可以套用打家劫舍基础版 的做法。只不过考虑的数组范围分成两种。一种是考虑首没考虑尾,一种是没考虑首考虑尾
调用两次基础函数后取最大值。
闲谈
最近掘金的创作等级到了4,这个等级写的文章都会推荐到首页,我之前没到4级写的200篇好像只有不到20被推荐到首页了,接下来的每一篇都会推荐到首页,意味着阅读量或许会增加,😄(nice~)还是挺开心的