题目:
题目链接: https://leetcode-cn.com/problems/house-robber/
解题思路:
动态规划
如果只有最后一家房屋,那么偷取的最高金额只有一种
如果只有最后两家房屋,偷取最高金额的方式也只有一种,就是偷取钱多的一家
从倒数第三家开始,偷取的方式变为了:偷取当前家和最后一家,或者只偷取倒数第二家两种
所以动态规划的状态转移公式为:
dp[i] = max(money[i] + dp[i + 2], dp[i + 1])
最后dp[0]就是可以偷取的最大钱数
代码实现:
class Solution:
def rob(self, nums: List[int]) -> int:
if 0 == len(nums):
return 0
elif 2 >= len(nums):
return max(nums)
dp = [0] * len(nums)
dp[-1] = nums[-1]
dp[-2] = max(nums[-1], nums[-2])
for index in range(len(nums) - 3, -1, -1):
dp[index] = max(nums[index] + dp[index + 2], dp[index + 1])
return dp[0]