leetcode 337打家劫舍 樹dp

2021-10-10 04:33:18 字數 1197 閱讀 2536

class

solution

: def rob

(self, root: treenode)

-> int:

# 最大問題分解為

# 在樹中,最常見的就是不斷劃分子樹

# 所以找每乙個節點的字數最大

# 維護兩個全域性字典

f=g=

f[none]=0

g[none]=0

# f means choose this node,g means dont choose

def dps

(t):

if t==none:

return

dps(t.left)

dps(t.right)

f[t]

=g[t.left]

+g[t.right]

+t.val

g[t]

=max

(f[t.left]

,g[t.left])+

max(f[t.right]

,g[t.right]

)dps

(root)

return

max(f[root]

,g[root]

)

後來發現不需要字典存:

class

solution

: def rob

(self, root: treenode)

-> int:

def _rob

(root)

:if not root:

return0,

0 # 偷,不偷

left =

_rob

(root.left)

right =

_rob

(root.right)

# 偷當前節點, 則左右子樹都不能偷

v1 = root.val + left[1]

+ right[1]

# 不偷當前節點, 則取左右子樹中最大的值

v2 =

max(left)

+max

(right)

return v1, v2

return

max(

_rob

(root)

)

LeetCode337 打家劫舍

在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...

leetcode337打家劫舍III

不搶劫該節點,則可以搶劫該節點的左右字節點 注意,node節點不搶不意味著一定要搶它的左右子結點,所以在方法中應該呼叫rob方法,而不是robinclude方法 public int robexclude treenode node return rob node.left rob node.rig...

Leetcode 337 打家劫舍 III

在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...