打家劫舍 iii
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。
計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。
示例 1:
輸入: [3,2,3,null,3,null,1]
3
/ \
2 3
\ \
3 1
輸出: 7
解釋: 小偷一晚能夠盜取的最高金額 = 3 + 3 + 1 = 7.
思路:由於是二叉樹的結構,並且我們可以將題目理解為,任何乙個節點處的最高金額為 max(該節點的錢+子孫節點的錢總和,兒子節點錢總和),小偷一晚盜取的最高金額為根節點的最高金額。
我們使用動態規劃來解決該題,首先定義狀態,對於任意乙個節點,我們可以選擇偷或者不偷,我們用res來表示此時的錢,res[0]表示不偷該節點時的錢,res[1]表示偷該節點時的錢。
那麼當前節點擊擇不偷時:最大值為=左右孩子能偷錢的總和。
當前節點擊擇偷時:最大值為=左孩子不偷+右孩子不偷+該節點的錢
那麼狀態轉移方程為:
root[0]
= math.
max(
rob(root.left)[0
],rob(root.left)[1
])+ math.
max(
rob(root.right)[0
],rob(root.right)[1
])root[1]
=rob
(root.left)[0
]+rob(root.right)[0
]+ root.val;
public
introb
(treenode root)
public
int[
]dfs
(treenode node)
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...