DP LeetCode265 粉刷房子 II

2021-10-08 01:21:42 字數 2127 閱讀 8097

同類題: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...