同類題:leetcode256. 粉刷房子 (序列型)
假如有一排房子,共 n 個,每個房子可以被粉刷成k 種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。
當然,因為市場上不同顏色油漆的**不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x k 的矩陣來表示的。
例如,costs[0][0] 表示第 0 號房子粉刷成 0 號顏色的成本花費;costs[1][2] 表示第 1 號房子粉刷成 2 號顏色的成本花費,以此類推。請你計算出粉刷完所有房子最少的花費成本。注意:所有花費均為正整數。
輸入: [[1,5,3],[2,9,4]]
輸出: 5
解釋: 將 0 號房子粉刷成 0 號顏色,1 號房子粉刷成 2 號顏色。最少花費: 1 + 4 = 5;
或者將 0 號房子粉刷成 2 號顏色,1 號房子粉刷成 0 號顏色。最少花費: 3 + 2 = 5.
高階:您能否在 o(nk) 的時間複雜度下解決此問題?
class solution(object):
def mincostii(self, costs):
""":type costs: list[list[int]]
:rtype: int
"""if not costs:
return 0
n = len(costs) # 房子數 n
k = len(costs[0]) # 顏色數 k
inf = float('inf')
dp = [[inf for _ in range(k)] for _ in range(n+1)]
# init
for i in range(k):
dp[0][i] = 0
id1, id2 = 0, 0 # 最小值和次小值的下標
for i in range(1, n+1):
min1 = inf # 花費最小值,記錄之前的dp,同時用 id1 記錄 j 時的顏色
min2 = inf # 花費次小值
for j in range(k): # 找到上乙個狀態[i-1]的花費最小數和次小數
if dp[i-1][j] < min1:
min2 = min1 # 將最小值 傳給次小值
id2 = id1
min1 = dp[i-1][j]
id1 = j
else:
if dp[i-1][j] < min2:
min2 = dp[i-1][j]
id2 = j
for j in range(k):
dp[i][j] = costs[i-1][j] # 當前房子的花費,注意對齊下標,dp是n+1維,costs是n維
if j != id1: # 與上個狀態最後的房子 不撞色,選最小值min1
dp[i][j] += min1
else: # 與上個狀態最後的房子 撞色,選次小值min2
dp[i][j] += min2
# res = inf
# for i in range(k):
# res = min(res, dp[n][i])
res = min(dp[n][:])
return res
costs = [[14,2,11],[11,14,5],[14,3,10]] # 三個屋子分別使用第1,2,1種顏色,花費2+5+3,總花費是10
優化:從o(nk*k)到o(nk),記錄最小值和次小值
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 ...
265 粉刷房子 II
首先這題可以和粉刷房子這題一樣解法,對於i號房子,遍歷k種顏色,對於每一種,都去找i 1號房子除該顏色之外的最小花費。但上一題是3種顏色,總複雜度o n 這題k種顏色,複雜度o nk 2 題目要求o nk 則對於i號房子我們儲存下當前房子最小的花費以備i 1號房子使用,但因為相鄰房子不能塗相同顏色的...
265 粉刷房子 II
題目描述 假如有一排房子,共 n 個,每個房子可以被粉刷成 k 種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。當然,因為市場上不同顏色油漆的 不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x k 的矩陣來表示的。例如,costs...