生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1473. 给房子涂色 III(DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
在一個小城市里,有 m 個房子排成一排,你需要給每個房子涂上 n 種顏色之一(顏色編號為 1 到 n )。
有的房子去年夏天已經涂過顏色了,所以這些房子不需要被重新涂色。
我們將連續相同顏色盡可能多的房子稱為一個街區。(比方說 houses = [1,2,2,3,3,2,1,1] ,它包含 5 個街區 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。)
給你一個數組 houses ,一個 m * n 的矩陣 cost 和一個整數 target ,其中:
- houses[i]:是第 i 個房子的顏色,0 表示這個房子還沒有被涂色。
- cost[i][j]:是將第 i 個房子涂成顏色 j+1 的花費。
請你返回房子涂色方案的最小總花費,使得每個房子都被涂色后,恰好組成 target 個街區。
如果沒有可用的涂色方案,請返回 -1 。
示例
1:
輸入:houses
= [0,0,0,0,0], cost
= [[1,10],[10,1],[10,1],[1,10],[5,1]],
m
= 5, n
= 2, target
= 3
輸出:
9
解釋:房子涂色方案為
[1,2,2,1,1]
此方案包含 target
= 3 個街區,分別是
[{1}, {2,2}, {1,1}]。
涂色的總花費為
(1 + 1 + 1 + 1 + 5) = 9。示例
2:
輸入:houses
= [0,2,1,2,0], cost
= [[1,10],[10,1],[10,1],[1,10],[5,1]],
m
= 5, n
= 2, target
= 3
輸出:
11
解釋:有的房子已經被涂色了,在此基礎上涂色方案為
[2,2,1,2,2]
此方案包含 target
= 3 個街區,分別是
[{2,2}, {1}, {2,2}]。
給第一個和最后一個房子涂色的花費為
(10 + 1) = 11。示例
3:
輸入:houses
= [0,0,0,0,0], cost
= [[1,10],[10,1],[1,10],[10,1],[1,10]],
m
= 5, n
= 2, target
= 5
輸出:
5示例
4:
輸入:houses
= [3,1,2,3], cost
= [[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
m
= 4, n
= 3, target
= 3
輸出:
-1
解釋:房子已經被涂色并組成了
4 個街區,分別是
[{3},{1},{2},{3}] ,
無法形成 target
= 3 個街區。提示:
m
== houses
.length
== cost
.length
n
== cost
[i
].length
1 <= m
<= 100
1 <= n
<= 20
1 <= target
<= m
0 <= houses
[i
] <= n
1 <= cost
[i
][j
] <= 10^4
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/paint-house-iii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- dp[i][c][j]表示刷完i號房子,其顏色為 c時,產生j個街區的最小花費
class Solution {
public:int minCost(vector
<int>& houses
, vector
<vector
<int>>& cost
, int m
, int n
, int target
) {int i
, j
, c1
, c2
, mincost
= INT_MAX
;vector
<vector
<vector
<int>>> dp(m
, vector
<vector
<int>>(n
+1, vector
<int>(m
+1, INT_MAX
)));if(houses
[0] != 0)dp
[0][houses
[0]][1] = 0;elsefor(c1
= 1; c1
< n
+1; ++c1
)dp
[0][c1
][1] = cost
[0][c1
-1];for(i
= 1; i
< m
; i
++) {for(c1
= 1; c1
< n
+1; c1
++){for(j
= 1; j
< m
; j
++){if(dp
[i
-1][c1
][j
] == INT_MAX
)continue;if(houses
[i
] != 0){if(houses
[i
] == c1
)dp
[i
][houses
[i
]][j
] = min(dp
[i
][houses
[i
]][j
], dp
[i
-1][c1
][j
]);elsedp
[i
][houses
[i
]][j
+1] = min(dp
[i
][houses
[i
]][j
+1], dp
[i
-1][c1
][j
]);}elsefor(c2
= 1; c2
< n
+1; c2
++){if(c1
== c2
)dp
[i
][c2
][j
] = min(dp
[i
][c2
][j
], dp
[i
-1][c1
][j
]+cost
[i
][c2
-1]);elsedp
[i
][c2
][j
+1] = min(dp
[i
][c2
][j
+1], dp
[i
-1][c1
][j
]+cost
[i
][c2
-1]);}}}}for(c1
= 1; c1
< n
+1; c1
++)mincost
= min(mincost
, dp
[m
-1][c1
][target
]);return mincost
==INT_MAX
? -1 : mincost
;}
};
100 ms 16.9 MB
總結
以上是生活随笔為你收集整理的LeetCode 1473. 给房子涂色 III(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。