思路
這是乙個典型的樹形dp問題,對每乙個節點都有兩種選擇:選他或者不選他。選他的話, 那麼就不能選擇它的父節點、兄弟節點和子節點;不選這個節點,那麼就可以選擇該節點的左右子樹(選最大的),建立乙個dp表,令dp[0]表示選,dp[1]表示不選。
class solution(object):
def rob(self, root):
""":type root: treenode
:rtype: int
"""#很經典的樹形dp
def dp(root):
if not root:
return [0, 0]
l = dp(root.left)
r = dp(root.right)
return [root.val + l[1] + r[1], max(l) + max(r)]
return max(dp(root))
337 打家劫舍 III
方法一 遞迴 超時!class solution 方法二 用雜湊表改進解決重複子問題,超時!class solution return res public int rob treenode root 方法三 用乙個pair分別記錄包含根節點和不包含根節點時的最大值 class solution a...
337 打家劫舍 III
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...
337 打家劫舍 III
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...