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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!