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 };
复制代码

 

posted @   跳动的休止符  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示