舉一反三 用樹型DP思想來解 House Robbery III_Leetcode #337

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 7 分鐘

題目敘述 House Robber III

題目會給我們一個二元樹,
二元樹裡的每個節點分別代表每棟房屋的價值,也就是房屋內有的現金數量。

題目敘述給的情境是假想盜賊要偷東西,限制是上下相鄰樓層的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。

請問盜賊可以得手的最大金額是多少?


測試範例

Example 1:

raw-image
Input: root = [3,2,3,null,3,null,1]
Output: 7
Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

下手的是上色的房屋,總共得到3+3+1=7單位的價值。​


Example 2:

raw-image
Input: root = [3,4,5,1,3,null,1]
Output: 9
Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9.

下手的是上色的房屋,總共得到4+5=9​單位的價值。​

約束條件

Constraints:

  • The number of nodes in the tree is in the range [1, 10^4].

節點總數量介於1~一萬。

  • 0 <= Node.val <= 10^4

每隔節點的價值介於0~一萬之間。


觀察 樹型DP + 取/不取的模型

對於我自己這個節點來說,總共只有兩個選擇。

1.如果選了我自己,那麼下一層(的左右子節點)都不可以選。

得手的最大價值 = 自己的價值 + 下一層都不選的情況下的最大價值


2.如果不選自己,那麼下一層的節點就可以考慮。

得手的最大價值 = 自己不選得到0 + 下一層納入考慮的最大價值


從樹根開始往下搜索,什麼時候停下來?


遇到空節點的時候停下來。

空節點本身沒有價值,也沒有子樹,不管選或不選都是0,價值都是0。



演算法 樹型DP + 取/不取的模型

1.定義DP狀態

每個節點都有兩種可能,選 或者 不選

定義 DP[ node ] = ( 選擇node得到的最大價值, 不選擇node得到的最大價值)


最後所求是什麼?


目標是整體的最大價值
= 從樹根開始考慮的最大價值
= Max( DP[ 樹根 ] ) = Max( DP[ root ] )


2.推導DP狀態轉移關係式

承接觀察點的思考


對於我自己這個節點node來說,總共只有兩個選擇。

1.如果選了我自己,那麼下一層(的左右子節點)都不可以選。

得手的最大價值
= 自己的價值 + 下一層都不選的情況下的最大價值
= 自己的價值 + 左子節點不選的情況下最大價值 + 右子節點不選的情況下最大價值

DP[ node ]

= node.val + DP[node.left][不選] + DP[node.right][不選]

= node.val + DP[node.left][1] + DP[node.right][1]


2.如果不選自己,那麼下一層的節點就可以考慮。

得手的最大價值
= 自己不選得到0 + 下一層納入考慮的最大價值
= 自己不選得到0 + 考慮左子節點的最大價值 + 考慮右子節點的最大價值

DP[ node ]

= 0 + Max( DP[node.left] ) + Max( DP[node.right] )

= Max( DP[node.left] ) + Max( DP[node.right] )


3.釐清DP初始條件

最小規模的問題是什麼?

從樹根開始往下搜索,什麼時候停下來?


空樹/空節點是最小規模的問題。

遇到空節點的時候停下來。

空節點本身沒有價值,也沒有子樹,不管選或不選都是0,價值都是0


程式碼 樹型DP + 取/不取的模型

class Solution:
def rob(self, root: TreeNode) -> int:

TAKE, NOT_TO_TAKE = 0, 1

def consider(node) -> (int, int):

## Base case
if not node:
# Empty node or empty tree
# take, not to take
return (0, 0)

## General cases
left = consider(node.left)
right = consider(node.right)

#take current node
take = node.val + left[NOT_TO_TAKE] + right[NOT_TO_TAKE]

#discard current node
discard = max(left) + max(right)

return ( take, discard )

# ---------------------------------

return max( consider(node=root) )


複雜度分析

時間複雜度:O( n )

樹型DP,從樹根開始搜索整棵樹,每個節點恰好計算一次。


空間複雜度:O(n)

樹型DP,從樹根開始搜索整棵樹,每個節點恰好計算一次。

遞迴recursion call stack深度最深為O(n)


關鍵知識點 樹型DP + 取/不取的模型


取/不取 的模型 可以說貫穿了整個House Robbery系列題
對於當下的房屋(節點),只有兩種情況,取 或 不取。
取 或 不取 又會因為不可相鄰的限制條件影響接下來的選擇。


對於我自己這個節點來說,總共只有兩個選擇。

1.如果選了我自己,那麼下一層(的左右子節點)都不可以選。

得手的最大價值 = 自己的價值 + 下一層都不選的情況下的最大價值


2.如果不選自己,那麼下一層的節點就可以考慮。

得手的最大價值 = 自己不選得到0 + 下一層納入考慮的最大價值


記得一起復習相關的前兩題,鞏固 取 / 不取 這個模型的知識點和DP框架。

House Robbery I

House Robbery II


Reference

[1] House Robber III - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
簡單談選舉(一)—投票兩三事由於投票日通常是上班日,外加過去很多人對政治相對冷感,所以美國選舉的時候(包括總統大選)投票率一向偏低,直到這幾年才有所改變。2020年總統大選投票率66%,依照我看到的內容,這投票率已經是美國史上最高。2018年期中選舉的投票率雖然只有49%,但也是1970年之後投票率最高的期中選舉。
Thumbnail
avatar
YK-Penguin
2023-11-20
舉一反大家沒有看錯,這篇的篇名就是舉一反,後面那個字,相信大家都輕易的能回答出來。沒錯,就是「三」。與「三」有關的成語很多,例如三心二意、三五成群、不三不四、三長兩短、無巧不成三⋯⋯不勝枚舉。《一字千金》的節目,時常有這樣子的填字遊戲,兼具知識性、挑戰性。
Thumbnail
avatar
JC Talks
2023-11-11
舉一反X 如何寫出自嗨又帶流量的旅遊創作大家沒有看錯,這篇的標題就是舉一反X,後面那個字,相信大家都輕易的能回答出來。答對了,就是「三」。與「三」有關的成語很多,例如三心二意、三五成群、不三不四、三長兩短、無巧不成三……不勝枚舉。《一字千金》的節目,時常有這樣子的填字遊戲,兼具知識性、挑戰性。
Thumbnail
avatar
JC Talks
2023-05-12
美國期中選舉 一場左派維持現狀與右派改變的對決美國期中選舉,川普與共和黨不如預期並沒有掀起浪潮,拜登與民主黨沒有出現兵敗如山倒。過去共和黨偏向保守,維持美國現狀,而民主黨要改變現狀,如今兩黨異位,對國家目前狀態的態度,左派現在更偏向保持美國現狀,更著重防止美國衰退,而共和黨更想要改變美國社會與政治界的基因,所以它被認為是比較激進的黨派的結果。
avatar
洪耀南
2022-11-09
【職場】長官指令模糊不清 要有舉一反三應變力星期一初上班,大長官進辦公室匆忙交代說:「馬上幫我找一下上星期在某某報紙,看到一篇講一個大企業管理相關的文章,等一下開會要用。」接著,便急忙忙開會去了。 處理各種業務也一樣,路是人走出來的,辦法是人想出來的,若此路不通便直接打退堂鼓,不想辦法尋找應變措施或其他替代方案,便是缺乏解決問題的能力。
Thumbnail
avatar
知秋
2021-12-27
新加坡選舉系列(一):選舉背景和反對黨位置新加坡在6月23日解散國會,6月30日提名,投票日落在7月10日,整個過程17天。若從提名日起算,扣除一天冷靜期和投票日,競選期有8天。跟過去兩屆大選相似。年初,新加坡重新劃分選區後,外界就一直猜測疫情稍緩就會開始大選。究竟選區劃分做了些什麼?一黨獨大之下,反對黨又能做些什麼?
Thumbnail
avatar
克敏
2020-07-01
香港又要選舉,一個必答問題香港基本法廿三條的問題講了很多年,尤其到了選舉。其實廿三條的問題就只有一個問題,這也是一個所有說爭取香港民主自由的人要答的問題。首先,面對現實,其實 2016 年開始,政府只要想要硬來,任何時候都可以提出並通過廿三條。就像送中條例一樣。
Thumbnail
avatar
鄭立
2020-04-18
悸動,是渺小的一舉一動張韻說:「好多事情都只有一次,好比說二十歲的生日、六十歲的含飴弄孫。可是你有想過嗎?童年的魅力也此起一次,因為他有著覆水難收的記憶,也有著影響你前進幸福的勇氣。」
Thumbnail
avatar
一月一日
2019-10-21
《不要與FED抗衡》市場出現了哪些訊號?讓美股一舉突破季線反壓?川普聯準會、政治與股市「股市和政治經濟,就像是相對的兩個半球,很明顯的,這兩個領域間具有各式各樣的依存關係。究竟是哪一邊影響哪一邊;是政治和經濟影響股市氣氛,還是金融市場的心理狀態影響了社會?馬丁茲威格的《擊敗黑色星期一的投資鬼才》,馬丁在第4章把「不要和Fed抗衡」作為章節標題剛好可以與2019年初的聯準會政策轉變連結
Thumbnail
avatar
JAFF
2019-03-09