你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def rob(self, nums: List[int]) -> int:
# dp[i]表示从第i家到最后一个物资偷窃能得到的最高金额
dp = [None] * len(nums)
self.helper(0,len(nums),nums,dp)
return dp[0]
def helper(self,start,end,nums,dp):
if start>=end:
return 0
if dp[start] != None:
return dp[start]
dp[start] = max(nums[start]+self.helper(start+2,end,nums,dp),self.helper(start+1,end,nums,dp))
return dp[start]
213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums)==1:
return nums[0]
# dp[i]表示从第i家到最后一个物资偷窃能得到的最高金额
dp = [None] * len(nums)
# 包含头不包含尾
self.helper(0,len(nums)-1,nums,dp)
temp = dp[0]
dp = [None] * len(nums)
# 包含尾不包含头
self.helper(1,len(nums),nums,dp)
temp2 = dp[1]
return max(temp,temp2)
def helper(self,start,end,nums,dp):
if start>=end:
return 0
if dp[start]!=None:
return dp[start]
# 对于当前房屋i
# 要么打劫当前房屋然后从i+2开始
# 要么不搭界当前房屋然后从i+1开始
dp[start] = max(nums[start]+self.helper(start+2,end,nums,dp),self.helper(start+1,end,nums,dp))
return dp[start]
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。
除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
res = self.helper(root)
return max(res)
def helper(self,root):
res = [0,0]
if root == None:
return res
#后序遍历
left = self.helper(root.left)
right = self.helper(root.right)
# 不偷当前节点那么考虑是否偷左右子节点
res[0] = max(left)+max(right)
# 偷当前节点那么必定不能偷左右
res[1] = root.val + left[0] + right[0]
return res