class Solution:
def rob(self, nums: List[int]):
n = len(nums)
f = [0] * (n + 2)
for i, x in enumerate(nums):
f[i + 2] = max(f[i + 1], f[i] + x)
return f[-1]
选nums[0],nums[1]和nums[-1]不能选,那么同上题nums[2: -1]
不选nums[0],同上题nums[1:]
class Solution:
def robl(self, nums: List[int]):
f0 = f1 = 0
for i, x in enumerate(nums):
f0, f1 = f1, max(f1, f0 + x)
return f1
def rob(self, nums: List[int]):
return max(nums[0] + self.robl(nums[2:-1]), self.robl(nums[1:]))
记忆化搜索
# 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]):
@cache
def dfs(node, pre):
if node is None:
return 0
if pre == 1:
return dfs(node.left, 0) + dfs(node.right, 0)
# 选当前结点
val1 = dfs(node.left, 1) + dfs(node.right, 1) + node.val
# 不选
val2 = dfs(node.left, 0) + dfs(node.right, 0)
return max(val1, val2)
return dfs(root, 0)
树形Dp
# 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]):
def dfs(node):
if node is None:
return 0, 0
left0, left1 = dfs(node.left)
right0, right1 = dfs(node.right)
# 选当前结点
val1 = left0 + right0 + node.val
# 不选
val0 = max(left0, left1) + max(right0, right1)
return val0, val1
val1, val2 = dfs(root)
return max(val1, val2)