1、题目描述
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
2、代码详解
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 1.dp[i] 代表当前最大子序和
# 2.动态方程: dp[i] = max(dp[i-1], nums[i-1]+dp[i-2]),即max(最后一个房子不偷, 最后一个房子偷)
# 3.初始化: 给没有房子时,dp一个位置,即:dp[0]
# 3.1 当n=0时,没有房子,dp[0]=0;
# 3.2 当n=1时,有一间房子,偷即可:dp[1]=nums[0]
n = len(nums)
if n == 0:
return 0
dp = [0] * (n+1) # 开辟n+1空间,[0, n]
dp[0] = 0 # 没有房子
dp[1] = nums[0] # 一栋房子
for i in range(2, n+1):
dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])
return dp[n]
nums = [3, 1, 2, 4] # 7
s = Solution()
print(s.rob(nums))
数组滚动写法
https://github.com/Light-City/Fight_Alg/blob/master/dp/README.md