模版题-动态规划-打家劫舍III( 树状dp )

管理员
```python # 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: # 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,称之为root。 # 除了root之外,每栋房子有且只有一个“父“房子与之相连。 # 一番侦察之后,聪明的小偷意识到 # “这个地方的所有房屋的排列类似于一棵二叉树”。 # 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。 def rob(self, root: Optional[TreeNode]) -> int: # 二叉树背景 —— 考虑用哪种遍历方式 # 后序遍历: 因为需要递归函数的返回值来做下一步计算 # 如果偷取当前节点, 左右孩子不能偷取 # 如果不偷当前节点, 左右孩子考虑偷取 # rob_( cur )返回cur节点考虑偷取的最大金额 def rob_( cur ): dp = [ 0, 0 ] if not cur: return dp left = rob_( cur.left ) right = rob_( cur.right ) # 不偷当前节点 > 左右节点偷取均可 dp[ 0 ] = max( left[ 0 ], left[ 1 ] ) + max( right[ 0 ], right[ 1 ] ) # 偷取当前节点 > 左右孩子不能偷取 dp[ 1 ] = left[ 0 ] + right[ 0 ] + cur.val return dp ans = rob_( root ) return max( ans[ 0 ], ans[ 1 ] ) ```
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧