time: 20190903
type: easy
假如有一排房子,共 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
。
這個題意我開始理解的都好費勁啊,給的這個輸入[[17,2,17],[16,16,5],[14,3,19]]
,我總是在想,第17號房子,第16號房子,第14號房子,三者不連續。。。
實際上,n個房子,是用順序下標的含義來表示的,這三個房子,每個三元陣列表示三種顏色對應的花費。
因為我自己卡在題意理解上了,那麼我就多說幾句。[17,2,17]
表示0號房子刷三種顏色分別的花費。
定義狀態f[i][j]
表示第i
號房子粉刷為顏色j
的最小花費。
考慮第i
套房子的花費時,需要考慮到第i-1
套房子的消費,因為相鄰的房子顏色不能相同。
每種房子可以選的顏色有三種,我們從第二棟房子開始建立狀態轉移表示式,考慮第二棟房子的時候,只需要看左邊的房子顏色怎麼選即可,如果當前房子選擇顏色1,則左邊的房子只能選擇顏色0和2,那麼f[i][0] = costs[i][0] + min(f[i-1][1], f[i-1][2])
。
當前房子有三種顏色可選,f[i][1] = costs[i][1] + min(f[i-1][0], f[i-1][2])
,f[i][2] = costs[i][2] + min(f[i-1][0], f[i-1][1])
.
第三棟房子只需要看第二棟房子怎麼選即可。這滿足無後效性。
直接在costs陣列上修改,省去了新開闢空間的麻煩,更新f陣列的過程,恰好costs還能發揮應用的作用(提供塗當前顏色的成本)。
class
solution
:def
mincost
(self, costs: list[list[
int]])
->
int:
ifnot costs:
return
0 f = costs
for i in
range(1
,len
(f))
: f[i][0
]+=min(f[i-1]
[1], f[i-1]
[2])
f[i][1
]+=min(f[i-1]
[0], f[i-1]
[2])
f[i][2
]+=min(f[i-1]
[0], f[i-1]
[1])
return
min(f[-1
])
end.
leetcode256 粉刷房子
假如有一排房子,共 n 個,每個房子可以被粉刷成紅色 藍色或者綠色這三種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。當然,因為市場上不同顏色油漆的 不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x 3 的矩陣來表示的。例如,co...
LeetCode 256 粉刷房子
假如有一排房子,共 n 個,每個房子可以被粉刷成紅色 藍色或者綠色這三種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。當然,因為市場上不同顏色油漆的 不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x 3 的矩陣來表示的。例如,co...
DP LeetCode256 粉刷房子
注意 所有花費均為正整數。輸入 17,2,17 16,16,5 14,3,19 輸出 10 解釋 將 0 號房子粉刷成藍色,1 號房子粉刷成綠色,2 號房子粉刷成藍色。最少花費 2 5 3 10。1 轉移方程 2 初始條件和邊界情況 3 計算順序 dp max 3 for in range n 1 ...