中文english
這裡有n
個房子在一列直線上,現在我們需要給房屋染色,分別有紅色藍色和綠色。每個房屋染不同的顏色費用也不同,你需要設計一種染色方案使得相鄰的房屋顏色不同,並且費用最小,返回最小的費用。
費用通過乙個n
x3
的矩陣給出,比如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
所有費用都是正整數
輸入測試資料 (每行乙個引數)如何理解測試資料?
classsolution:
""" @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])
優化版:(不確定多少種染料)
classsolution:
""" @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 解釋 最長遞增子...