用取捨DP框架來上色 粉刷房屋I_Paint House_Leetcode #256

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

題目敘述 Paint House

題目會給定一個成本陣列costs,分別代表每棟房屋粉刷成紅色、藍色、綠色的成本。

請問粉刷所有房屋的最小成本是多少,而且相鄰的房屋不可同一種顏色


註: 如果您是沒有訂閱Leetcode Premium的讀者,
可以到這邊看原文題目和上機考平臺練習


測試範例

Example 1:

Input: costs = [[17,2,17],[16,16,5],[14,3,19]]
Output: 10
Explanation: Paint house 0 into blue, paint house 1 into green, paint house 2 into blue.
Minimum cost: 2 + 5 + 3 = 10.

第一棟房屋著成藍色,花費2元。
第二棟房屋著成​綠色,花費5元。
第三棟房屋著成藍色,花費3元。
總共花費2+5+3元。​

Example 2:

Input: costs = [[7,6,2]]
Output: 2

第一棟房屋著成綠色,花費2元。
總共花費2+5+3元。​

約束條件

Constraints:

  • costs.length == n

輸入陣列總長度為n,代表有n棟房屋。

  • costs[i].length == 3

cost[i]代表第i棟房屋著成成紅色、藍色、綠色的成本。

  • 1 <= n <= 100

房屋總數n值 介於 1~100

  • 1 <= costs[i][j] <= 20

單次著色成本介於1~20之間。


觀察 同色不相鄰

題目的意思換句話說就是同色不相鄰之下的全體著色最小成本

現在當下在第i棟房屋,每個顏色都有取/不取兩種可能
取了這個顏色,下一棟就不可以用這個顏色


我們可以定義DP[i, prevColor]代表第i棟房屋~最後一棟房屋的最小著色成本,prevColor代表前一棟被用掉的顏色


DP[i, prevColor]代表第i棟房屋~最後一棟房屋的最小著色成本

= min{ 第i棟房屋房屋選一個不和前一棟重複的顏色著色,接著考慮下一棟 }

= min{ costs[i][color] + DP[i+1, color] where color != prevColor }


什麼時候停下來?

當已經塗完最後一棟房屋的時候,這時候已經沒有更多房子了,成本=0

DP[i, prevColor] = 0, if i = n = 房屋總數 = len( costs )


演算法 DP動態規劃 + 取捨DP框架

1.定義DP狀態

承接觀察點的思考

我們可以定義DP[i, prevColor]代表第i棟房屋~最後一棟房屋的最小著色成本,prevColor代表前一棟被用掉的顏色


最終目標是什麼?

目標是所有房屋 第一棟~最後一棟的整體著色最小成本

= DP[ 0, prevColor = DUMMY 第一棟沒有前一棟,所以顏色可以任選 ]


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

現在要做的是計算同色不相鄰之下的全體著色最小成本

現在當下在第i棟房屋,每個顏色都有取/不取兩種可能

取了這個顏色,下一棟就不可以用這個顏色


DP[i, prevColor]代表第i棟房屋~最後一棟房屋的最小著色成本

= min{ 第i棟房屋房屋選一個不和前一棟重複的顏色著色,接著考慮下一棟 }

= min{ costs[i][color] + DP[i+1, color] where color != prevColor }


3.釐清DP初始狀態

什麼時候停下來?

最小規模的問題是什麼?


當已經塗完最後一棟房屋的時候,這時候已經沒有更多房子了,成本=0

DP[i, prevColor] = 0, if i = n = 房屋總數 = len( costs )


程式碼 DP動態規劃 + 取捨DP框架

class Solution:
def minCost(self, costs: List[List[int]]) -> int:

# COLOR Constant to helper reader understand source code
DUMMY, RED, BLUE, GREEN = -1, 0, 1, 2

# DP table
dp = {}

# Paint house i to last house with overall minimal cost
def paint( i, prevColor ):

## Base case:
# No more house, cost = 0
if i == (len(costs)):
dp[i, prevColor] = 0
return 0

## Look-up DP table
if (i, prevColor) in dp:
return dp[(i, prevColor)]

## General cases
# Paint current house with different color to previous house.
# Choose minimal overall cost
minCost = min( [costs[i][color] + paint(i+1, prevColor=color) for color in range(3) if color != prevColor] )
dp[(i, prevColor)] = minCost
return minCost

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

return paint(i=0, prevColor=DUMMY)

複雜度分析

時間複雜度:O(n)

線性掃描每棟房屋,每棟房屋可以在O(1)選擇最佳的著色方案。


空間複雜度: O(n)

DP table 所需空間大小為O(3n),紀錄每棟房屋~最後一棟房屋對應的最小著色成本。


關鍵知識點

這題的限制在於同色不相鄰

每個顏色 只有選 或是 不選 兩種可能,
一旦選擇了,下一棟房屋就不可以重複用同樣的顏色。


對應到的就是 取(著這個顏色)/不取(不著這格顏色) 的DP框架,


比較接近的是House Robbery的系列題(每棟房屋要嘛選擇,要嘛跳過),

強烈建議讀者一起複習,鞏固知識點。

一魚多吃 用DP解House Robbery 打家劫舍問題_Leetcode #198_Leetcode 精選75題解析

化簡無所不在 用學過的DP模型解House Robbery II_Leetcode #213

合縱連橫: 從區間DP理解House Robbery系列題 背後的本質


類似的還有用取捨DP來考高分 Solving Questions With Brainpower


Reference

[1] Paint House - LeetCode


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

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
給我在取捨中的親/友,你那讓人不捨之:"人生的難"(13/13):夫妻對應4_丈夫的改變2剛才老陳夫妻吃早餐時,老陳與國/高/中/大學的同學群組+妻子分享一段網路文章:說明和信癌症醫院創院院長黃達夫82歲,自己經過疾病鬼門關走一回的體會:許多癌症的病因是長期不良生活習慣造成的。結果妻子立刻回問:“你有跟人分享嗎?”,讓老陳感覺被抓包+有作錯事的感覺。透過老陳以問句代替反擊,達成雙方的良性
Thumbnail
avatar
老驢
2023-01-30
給我在取捨中的親/友,你那讓人不捨之:"人生的難"(12/12):夫妻對應3_丈夫的改變1老陳因為學習"科技養生":使用脈診儀監控自己的氣血+經絡"跟隨生活的內外衝擊+影響而導致的變化;來作及時適當的回應+調理=持續維持健康生活的好常態,其中,包含可以產生"萬病同治"效果的睡眠:許多身體的勞累+損傷,幾乎都可以透過白天+晚上良好睡眠,來達到自愈的效果。老陳因為自我省察到夫妻關係進入老後的
Thumbnail
avatar
老驢
2023-01-29
給我在取捨中的親/友,你那讓人不捨之:"人生的難"(11/11):夫妻對應2老陳有ㄧ晚與妻子在家共進晚餐,妻子剛辛苦備菜+炒菜+作湯(還是老陳最喜歡的福州魚丸湯)+方坐下來+吃上ㄧ口+老陳正稱讚:"好吃又好喝"時;妻子突然提出一個問題:"請問,你知道【理解】與【了解】這二者,有何差別嗎?"。老陳作為普通男人的直接回應,常導致關係進入負面循環,其關鍵是自己的改變,而非依賴對方
Thumbnail
avatar
老驢
2023-01-23
給我在取捨中的親/友,你那讓人不捨之:"人生的難"(8/8):夫妻對應1老陳夫妻在大學時,於教會團契中認識+交往=竟遭當時妻子的母親,因為雙方父母+家庭處於台灣的ㄧ南方+ㄧ東北,而加以反對;然而,雙方繼續私下交往,在老陳預官退伍後,男女雙方因人生安排的理念差異先痛苦分手,再神奇的在父母鼓勵支持之下而牽手。 說明婚姻40年的夫妻關係,需要老陳自己先自我省察,自己過度專注職
Thumbnail
avatar
老驢
2023-01-13
【影評】夢想和現實間的取捨《喬瑟與虎與魚群》. 2020年日本上映的《喬瑟與虎與魚群》。 一個身坐輪椅的女孩,喬瑟,在一個夜晚,因為意外,輪椅失控使得女孩飛了出去,撞上為了夢想前往墨西哥的男孩,恆夫。 最喜歡的一段是 「我想要去看海。」 「走吧,我帶你去。」 推薦! 推薦指數:⭐️⭐️⭐️⭐️4.2/5.0 💡『夢想和現實間的取捨』
Thumbnail
avatar
Movie Loile
2022-09-04
精子狀況不佳,人工受孕&試管嬰兒取捨?QA:當精子狀況不佳,人工受孕與試管嬰兒該如何取捨呢?​ (1)當精子數量及活動力未達正常標準但也沒有太差,可以考慮進行人工受孕的療程!​ ​ (2)但如果是精子活動力不足、數量不足,則會直接影響順利著床的機率。特別如果是精子形態不佳,畸形率較高,那人工受孕的成功率也會更低。​ ​ ​
Thumbnail
avatar
\SOHO/ 小六小姐
2022-06-21
【生活札記】漂亮跟實用果然要做取捨嗎?為什麼突然說這個呢? 不知道大家有沒有那種明知道這東西只是漂亮但不實用還是買了,等到過了那段覺得東西漂亮的日子過後不實用那面赤裸裸展現在你面前的時候?
Thumbnail
avatar
珞荷
2021-12-23
《選 3 哲學》:取捨才能擁有更好的人生不平衡發展的人生的確會有犧牲,不過,這種犧牲是良性的,你必須放棄兼顧一切的觀念;放棄了某件事,或是認清你只是凡人,這種感覺可能會讓你很難接受。但是我發誓,一旦你開始專注,分清楚輕重緩急,選3項來做;一旦你容許自己可以有所取捨,而不是事事兼顧,那麼,你會發現自己更開心、更充實,而且在你所選擇的事情上。
Thumbnail
avatar
Gimmy
2020-04-27
博物館科技應用的取捨:到底該讓遊客看展品還是玩互動?這通常關係三個主要層面:展演對象、展陳內容和展示目標。
Thumbnail
avatar
梁子Liangz
2019-06-04