256. 粉刷房子(序列型動態規劃)
阿新 • • 發佈:2022-04-12
256. 粉刷房子
假如有一排房子,共n
個,每個房子可以被粉刷成紅色、藍色或者綠色這三種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。
當然,因為市場上不同顏色油漆的價格不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以一個 n x 3
的正整數矩陣 costs
來表示的。
例如,costs[0][0]
表示第 0 號房子粉刷成紅色的成本花費;costs[1][2]
表示第 1 號房子粉刷成綠色的花費,以此類推。
請計算出粉刷完所有房子最少的花費成本。
示例 1:
輸入: costs = [[17,2,17],[16,16,5],[14,3,19]] 輸出: 10 解釋: 將 0 號房子粉刷成藍色,1 號房子粉刷成綠色,2 號房子粉刷成藍色。 最少花費: 2 + 5 + 3 = 10。
示例 2:
輸入: costs = [[7,6,2]] 輸出: 2
提示:
costs.length == n
costs[i].length == 3
1 <= n <= 100
1 <= costs[i][j] <= 20
思路見:
https://www.bilibili.com/video/BV1nt4y1Y7n7?p=2&share_source=copy_web
1 class Solution { 2 public: 3 static constexpr int MAX_INF = 0x3F3F3F3F; 4 int minCost(vector<vector<int>>& costs) { 5 int length = costs.size(); 6 if (length == 0) { 7 return 0; 8 } 9 vector<vector<int>> dp(length + 1, vector<int>(3, MAX_INF)); 10 // 初始化 11 dp[0][0] = 0; 12 dp[0][1] = 0; 13 dp[0][2] = 0;14 for (unsigned int i = 1; i <= length; i++) { 15 // j是第i - 1個房子的顏色 16 for (unsigned int j = 0; j < 3; j++) { 17 // k 是第i - 2個房子的顏色 18 for (unsigned int k = 0; k < 3; k++) { 19 // 第i - 1個房子的顏色不能與第i - 2個房子的顏色一樣 20 if (j == k) { 21 continue; 22 } 23 dp[i][j] = min(dp[i][j], (dp[i - 1][k] + costs[i - 1][j])); 24 } 25 } 26 } 27 int ans = dp[length][0]; 28 ans = min(ans, dp[length][1]); 29 ans = min(ans, dp[length][2]); 30 return ans; 31 } 32 };