这一道题乍一看可以双层循环暴力解,但是仔细一想有可能最大利益并不是一家隔着一家偷,我可以间隔很多家偷,所以 这个题的思路还是有点像爬楼梯,用动态规划解。
首先确立动态规划的初始条件:
1.dp[0]=nums[0]只有一家
2.dp[1]=max(nums[0],nums[1])有两家选一家多的
然后确立动态规划的循环条件:
dp[i]应该是什么
1.第i家能拿,那么dp[i]=nums[i]+dp[i-2],能拿说明上一家没拿过,那么我们就要这家的值加上dp[i-2],你也甭管上上家拿过没。
2.第i家不能拿,说明上家拿过了,那么dp[i]=dp[i-1]
那么dp[i]就取这两个其中的最大值。
class Solution:
def rob(self, nums: List[int]) -> int:
#如果为空列表则只能偷0元
if not nums:
return 0
size=len(nums)
#如果长度为1则只能偷一家直接返回
if size==1:
return nums[0]
#如果长度为2则能偷两家,比两家哪个大
if size==2:
return max(nums[0],nums[1])
#如果超过这个范围则进行dp
#dp初始条件
dp=[0]*size
dp[0]=nums[0]
dp[1]=max(nums[0],nums[1])
#dp的循环条件,从2开始一直到最后一个元素
for i in range(2,size):
dp[i]=max(dp[i-1],dp[i-2]+nums[i])
return dp[size-1]