算法---动态规划练习-9(粉刷房子)

题目

  • [1. 题目解析](#1. 题目解析)
  • [2. 讲解算法原理](#2. 讲解算法原理)
  • [3. 编写代码](#3. 编写代码)

1. 题目解析

题目地址点这里

2. 讲解算法原理



  1. 创建dp表:vector<vector> dp(n, vector(3))。这里创建了一个二维向量dp,其中dpij表示第i天选择颜色j的最小成本。

  2. 初始化第一天的成本:for (int i = 0; i < 3; i++) { dp0i = costs0i; }。将第一天的成本设置为初始的颜色成本。

  3. 填表:使用循环遍历从第二天到最后一天,依次计算每天选择不同颜色的最小成本。

    • dpi0 = min(dpi - 11, dpi - 12) + costsi0:第i天选择颜色0的最小成本等于前一天选择颜色1和2的最小成本中的较小值加上当天选择颜色0的成本。
    • dpi1 = min(dpi - 10, dpi - 12) + costsi1:第i天选择颜色1的最小成本等于前一天选择颜色0和2的最小成本中的较小值加上当天选择颜色1的成本。
    • dpi2 = min(dpi - 11, dpi - 10) + costsi2:第i天选择颜色2的最小成本等于前一天选择颜色1和0的最小成本中的较小值加上当天选择颜色2的成本。
  4. 返回结果:return min(dpn - 10, min(dpn - 11, dpn - 12))。返回最后一天选择不同颜色的最小成本中的最小值,即为最小成本。


3. 编写代码

cpp 复制代码
class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n=costs.size();
        vector<vector<int>> dp(n,vector<int>(3));
        for(int i=0;i<3;i++)dp[0][i]=costs[0][i];
        if(n>1)
        {
        for(int i=1;i<n;i++)
        {
            dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0];
            dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i][1];
            dp[i][2]=min(dp[i-1][1],dp[i-1][0])+costs[i][2];
        }
        }
        return min(dp[n-1][0],min(dp[n-1][1],dp[n-1][2]));
    }
};
相关推荐
古城小栈9 小时前
为啥说:训练用BF16,推理用FP16
人工智能·算法·机器学习
KaMeidebaby9 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
浆果020710 小时前
NanoTrack C++ — RK3588 实时目标跟踪
c++·目标跟踪·rk3588
Turbo正则10 小时前
群论在AI中的应用概述
人工智能·算法·抽象代数
ysa05103010 小时前
【并查集】判环
c++·笔记·算法
持力行10 小时前
C/C++ 中的 char*:它标识数组吗?为什么能用下标访问?
c语言·c++
Jerry10 小时前
KeetCode 44. 开发商购买土地
算法
Jerry11 小时前
KeetCode 58. 区间和
算法
Jerry11 小时前
LeetCode 209. 长度最小的子数组
算法
汉克老师12 小时前
GESP2026年6月认证C++六级( 第三部分编程题(2、满二叉树))精讲
c++·深度优先·树形dp·满二叉树·gesp六级·树形dfs