337. 打家劫舍 III 树上打家劫舍 python 记忆化搜索板子

文章描述了一个名为`Solution`的类,其中包含方法`rob`,用于计算在二叉树中,小偷在每个节点选择或不选择的情况下所能获取的最大金额。算法利用递归和缓存技术来优化计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值