515 房屋染色 序列型動態規劃

2022-02-14 23:29:56 字數 3023 閱讀 1155

中文english

這裡有n個房子在一列直線上,現在我們需要給房屋染色,分別有紅色藍色和綠色。每個房屋染不同的顏色費用也不同,你需要設計一種染色方案使得相鄰的房屋顏色不同,並且費用最小,返回最小的費用。

費用通過乙個nx3的矩陣給出,比如cost[0][0]表示房屋0染紅色的費用,cost[1][2]表示房屋1染綠色的費用。

樣例 1:

輸入: [[14,2,11],[11,14,5],[14,3,10]]

輸出: 10

解釋: 第乙個屋子染藍色,第二個染綠色,第三個染藍色,最小花費:2 + 5 + 3 = 10.

樣例 2:

輸入: [[1,2,3],[1,4,6]]

輸出: 3

所有費用都是正整數

輸入測試資料 (每行乙個引數)如何理解測試資料?

class

solution:

""" @param costs: n x 3

cost matrix

@return: an integer, the minimum cost to paint all houses

""""""

大致思路:

1.確定狀態

l =len(costs)

最後一步:dp[l - 1

] 子問題:

轉化為前n - 1棟房子的最小花費,然後實際會求得3個花費值出來,分別是dp[i - 1][0],dp[i - 1][1],dp[i - 1][2

]

2.轉移方程,下面也不會出現顏色相等的情況了,上乙個的費用 +當前顏色的費用

dp[i][

0] = min(dp[i - 1][1] + costs[1],dp[i - 1][2] + costs[2

]) dp[i][

1] = min(dp[i - 1][0] + costs[0],dp[i - 1][2] + costs[2

]) dp[i][

2] = min(dp[i - 1][0] + costs[0],dp[i - 1][1] + costs[1

])

3.初始條件

dp = [sys.maxsize]*l

"""def mincost(self, costs):

# write your code here

if not costs:return

0#初始化

l =len(costs)

dp = [[sys.maxsize]*3

for _ in

range(l)]

#計算順序

for i in

range(l):

if (i == 0

): dp[

0][0] = costs[0][0

] dp[

0][1] = costs[0][1

] dp[

0][2] = costs[0][2

]

continue

#當前為紅,取上乙個為藍的最小總費用 + 當前紅的費用 和上乙個為綠的最小總費用 +當前為紅的費用,取出最小值出來

dp[i][

0] = min(dp[i - 1][1] + costs[i][0],dp[i - 1][2] + costs[i][0

]) dp[i][

1] = min(dp[i - 1][0] + costs[i][1],dp[i - 1][2] + costs[i][1

]) dp[i][

2] = min(dp[i - 1][0] + costs[i][2],dp[i - 1][1] + costs[i][2

])

return min(dp[l - 1])

優化版:(不確定多少種染料)

class

solution:

""" @param costs: n x 3

cost matrix

@return: an integer, the minimum cost to paint all houses

"""def mincost(self, costs):

# write your code here

if not costs:return

0#初始化

l =len(costs)

c = len(costs[0

]) dp = [[sys.maxsize]*c for _ in

range(l)]

#計算順序

for i in

range(l):

for j in

range(c):

#如果是0的話,說明是第乙個房子,則直接分別得到染三種顏色的不同花費多少

if (i == 0

): dp[

0][j] = costs[0

][j]

#不用continue,i = 0

的有c種情況

#迴圈取出當前房子的顏色j,和上乙個房子的顏色為k,的所有總花費出來

for k in

range(c):

if (k !=j):

#分別是dp[i][

0],dp[i][1],dp[i][2

]...求得的,不同的最小值花費和

dp[i][j] = min(dp[i - 1][k] +costs[i][j],dp[i][j])

return min(dp[l - 1

])

LintCode 516 房屋染色II

序列型動態規劃 與lintcode 515類似,由於顏色數從3變為k,源 經過簡單修改也可ac。time 3142mspublic class solution int res integer.max value for int i 0 i return res 但可在尋找最小值時進行優化,將原演算...

序列型動態規劃 打家劫舍2

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 給定乙個代表每個房屋存放金額的非負整數陣列,計算你 在不觸動警...

序列型動態規劃 最長遞增子串行

給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 輸入 nums 10,9,2,5,3,7,101,18 輸出 4 解釋 最長遞增子...