题目标签
动态规划
解题思路
首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。
如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k(k>2)
间房屋,有两个选项:
偷窃第k
间房屋,那么就不能偷窃第k-1
间房屋,偷窃总金额为前k-2
间房屋的最高总金额与第k
间房屋的金额之和。
不偷窃第k
间房屋,偷窃总金额为前k-1
间房屋的最高总金额。
在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 kk 间房屋能偷窃到的最高总金额
用dp[i]
表示前i
间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:
dp[i]=max(dp[i−2]+nums[i],dp[i−1])
边界条件为:
dp[0] = nums[0]
-> 只有一间房屋,则偷窃该房屋
dp[1] = max(nums[0],nums[1])
-> 只有两间房屋,选择其中金额较高的房屋进行偷窃
最终的答案即为 dp[n−1]
,其中n
是数组的长度。
AC代码
1 | func rob(nums []int) (ans int) { |
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !