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 == ncosts[i].length == 31 <= n <= 1001 <= 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 };
浙公网安备 33010602011771号