思路:樹狀dp
對於根節點為 rt 的子樹,dp[rt][k]為其根節點取和不取(k=0/1)時子樹的最大價值,ld,rd分別為其左右節點,那麼
dp[rt][0]=max(dp[ld][0],dp[ld][1])+max(dp[rd][0],dp[rd][1]);
dp[rt][1]=dp[ld][0]+dp[rd][0]+root->val;
由於不知道其節點的下標以及dp只與其左右節點相關,因此可以直接dfs返回dp[rt][0,1]給父節點即可
code:
class
solution
pair<
int,
int>
dfs(treenode* root)
; pair<
int,
int> rt,dl,dr;
dl=dfs(root-
>left)
; dr=
dfs(root-
>right)
; rt.first=
max(dl.first,dl.second)
+max
(dr.first,dr.second)
; rt.second=dl.first+dr.first+root-
>val;
return rt;}}
;
LeetCode337 打家劫舍
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...
leetcode337打家劫舍III
不搶劫該節點,則可以搶劫該節點的左右字節點 注意,node節點不搶不意味著一定要搶它的左右子結點,所以在方法中應該呼叫rob方法,而不是robinclude方法 public int robexclude treenode node return rob node.left rob node.rig...
Leetcode 337 打家劫舍 III
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計...