1. 程式人生 > 其它 >256. 粉刷房子(序列型動態規劃)

256. 粉刷房子(序列型動態規劃)

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 };