Leetcode 256 粉刷房子

2021-09-26 20:10:16 字數 1823 閱讀 3292

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 ...