假如有一排房子,共 n 個,每個房子可以被粉刷成紅色、藍色或者綠色這三種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。
當然,因為市場上不同顏色油漆的**不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x 3 的矩陣來表示的。
例如,costs[0][0] 表示第 0 號房子粉刷成紅色的成本花費;costs[1][2] 表示第 1 號房子粉刷成綠色的花費,以此類推。請你計算出粉刷完所有房子最少的花費成本。
注意:所有花費均為正整數。
示例:
輸入: [[17,2,17],[16,16,5],[14,3,19]]
輸出: 10
解釋: 將 0 號房子粉刷成藍色,1 號房子粉刷成綠色,2 號房子粉刷成藍色。
最少花費: 2 + 5 + 3 = 10。
從題目的提問方式中應該能看出該題目是典型的最值型動態規劃問題。
我們的最終目的是為了使得粉刷完所有的房子花費最少的成本。直接套用以前的思路,記錄油漆前n棟房子的最小花費。,同時我們還需要記錄油漆前n-1棟房子的最小花費。但是存在乙個問題,前n-1棟房子的最小花費中,不知道房子n-2是什麼顏色。其實這個問題很好處理,直接把它記錄下來開乙個陣列分別記錄前n-1棟房子並且n-2棟房子是紅色、藍色綠色的最小花費。因此我們可以假設狀態:f[i][0],f[i][1],f[i][2]分別記錄油漆前i棟房子並且房子i-1是紅色、藍色、綠色的最小花費。
設油漆前i棟房子並且房子i-1是紅色、藍色、綠色的最花費分別為
初始條件:f[0][0]=f[0][1]=f[0][2]=0表示不油漆任何房子的花費。
逐行計算,答案是min
時間複雜度是o(n),空間複雜度是o(n)
class
solution
(object):
defmincost
(self, costs)
:"""
:type costs: list[list[int]]
:rtype: int
"""iflen
(costs)==0
:return
0 dp =[[
0]*3
for i in
range
(len
(costs))]
for i in
range(3
):dp[0]
[i]= costs[0]
[i]for i in
range(1
,len
(costs)):
for j in
range(3
):d = j +
1 e = j +
2 dp[i]
[j]=
min(dp[i -1]
[d %3]
+ costs[i]
[j], costs[i]
[j]+ dp[i -1]
[e %3]
)return
min(dp[
len(costs)-1
][0]
, dp[
len(costs)-1
][1]
, dp[
len(costs)-1
][2]
)
序列型動態規劃 打家劫舍2
你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 給定乙個代表每個房屋存放金額的非負整數陣列,計算你 在不觸動警...
序列型動態規劃 最長遞增子串行
給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 輸入 nums 10,9,2,5,3,7,101,18 輸出 4 解釋 最長遞增子...
區間型動態規劃
給定乙個序列 字串,進行一些操作 最後一步將序列 字串去頭 去尾 剩下的會是乙個區間 i,j 狀態自然定義為f i j 表示面對子串行 i j 時的最優性質 667.最長的回文序列 中文english 給一字串 s,找出在 s 中的最長回文子串行的長度.你可以假設 s 的最大長度為 1000.exa...