from typing import List
classSolution:defrob(self, nums: List[int])->int:iflen(nums)<=2:returnmax(nums)
n =len(nums)
dp =[0]* n
dp[0]= nums[0]
dp[1]=max(nums[0], nums[1])for i inrange(2, n):
dp[i]=max(dp[i -1], dp[i -2]+ nums[i])return dp[n -1]if __name__ =="__main__":
s = Solution()
a = s.rob([2,1,1,2])print(a)
2.2 解法2
from typing import List
# 动态规划方法from typing import List
# 动态规划方法classSolution:defrob(self, nums: List[int])->int:
count =len(nums)if count ==0:return0
memo =[0]*(count +1)
memo[-2]= nums[-1]# 这里需要计算当数组长度只有1个时,避免状态转移方程memo[-2] 数组溢出for i inrange(count -2,-1,-1):
memo[i]=max(memo[i +1], memo[i +2]+ nums[i])return memo[0]if __name__ =="__main__":
s = Solution()
a = s.rob([2,7,9,3,1])print(a)
2.3 解法3 (记忆化递归方法)
from typing import List
# 记忆化递归方法classSolution:defrob(self, nums: List[int])->int:
memo =[-1]*(len(nums)+1)return self.helper(0, nums, memo)# i 表示子数组长度defhelper(self, i:int, nums: List[int], memo: List[int])->int:if i >=len(nums):return0if memo[i]!=-1:# 表示已经计算完毕,不用再次计算return memo[i]
memo[i]=max(self.helper(i +1, nums, memo), self.helper(i +2, nums, memo)+ nums[i])return memo[i]