# 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:
"""
有点类似灵神 炒股票的 板子
"""
@cache
def f(root: TreeNode, pick: bool):
"""
以root为根节点 pick or not 小偷能盗取的最高金额
"""
if not root:
return 0 if not pick else -inf # 不合法的情况置为-inf,即pick 空节点
# 如果 pick root,最大值就是以root.left, root.right 为根节点且not pick root.left and root.right的最大值,与root.val的和
if pick:
return root.val + f(root.right, False) + f(root.left, False)
# 如果not pick root, 最大值就是以root.left, root.right 为根节点和的最大值 (此时左右两边是独立的,各自计算他们pick or not的最大值即可)
return max(f(root.right, False), f(root.right, True)) + max(f(root.left, False), f(root.left, True))
return max(f(root,True), f(root,False))
337. 打家劫舍 III 树上打家劫舍 python 记忆化搜索板子
于 2024-03-28 17:06:20 首次发布