跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

动态规划:粉刷房子问题

介绍使用动态规划解决粉刷房子问题。题目要求对 n 个房子进行粉刷,共有三种颜色可选,相邻房子颜色不能相同,目标是使总花费最小。核心思路是定义 dp[i][j] 表示涂到第 i 个房子且颜色为 j 时的最小花费。通过状态转移方程,当前状态取决于上一状态中不同颜色的最小值加上当前成本。初始化时添加虚拟节点以简化边界逻辑。最终结果为最后一个房子三种颜色状态中的最小值。代码使用 C++ 实现。

极客工坊发布于 2026/3/30更新于 2026/7/1642 浏览
动态规划:粉刷房子问题

题目描述

题目链接:LCR 091. 粉刷房子

文章配图

题目解析

根据图示,costs 数组的行代表房子的编号,列索引分别对应红色(0)、蓝色(1)、绿色(2)。粉刷房子只需保证相邻两个房子颜色不同即可。

文章配图

算法原理

状态表示

  • dp[i][0]:涂到第 i 个位置时,最后一个位置粉刷红色的最小花费。
  • dp[i][1]:涂到第 i 个位置时,最后一个位置粉刷蓝色的最小花费。
  • dp[i][2]:涂到第 i 个位置时,最后一个位置粉刷绿色的最小花费。

状态转移方程

根据上一步的状态划分问题:

  1. dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + costs[i][0]
  2. dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + costs[i][1]
  3. dp[i][2] = min(dp[i-1][1], dp[i-1][0]) + costs[i][2]

初始化

为了简化边界处理,在 dp 表前增加一个虚拟节点。本题初始化为 0。下标映射关系:由于增加了虚拟节点,原数组下标需统一减 1 进行访问。

填表顺序

从左往右,三个状态同时更新。

返回值

返回最后一个房子三种颜色的最小花费:min(dp[n][0], min(dp[n][1], dp[n][2]))。

代码实现

动态规划的固定四步骤:创建 dp 表、初始化、填表、确定返回值。

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        // 1. 创建一个规模 (n+1)*3 的 dp 表
        vector<vector<int>> dp(n + 1, vector<int>(3));
        // 2. 初始化为 0,vector 默认为 0
        // 3. 填表
        for (int i = 1; i <= n; i++) {
            // 下标都 -1 是因为数组前面加了一个虚拟节点
            dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
            dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
            dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];
        }
        // 4. 确定返回值
        return min(dp[n][0], min(dp[n][1], dp[n][2]));
    }
};

目录

  1. 题目描述
  2. 题目解析
  3. 算法原理
  4. 状态表示
  5. 状态转移方程
  6. 初始化
  7. 填表顺序
  8. 返回值
  9. 代码实现
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 解决 PKIX path building failed: SSL 证书导入 Java 信任库实战
  • Java 多线程之原子操作类
  • TwinRL-VLA:数字孪生驱动的机器人强化学习与现实应用
  • C++ 哈希表封装:模拟实现 unordered_map 和 unordered_set
  • 吴恩达详解 AI Agent 四步设计:反思、工具、规划与多智能体协同
  • Android WebView 版本升级方案详解
  • LeetCode 热题 100 快速通关指南(附模板)
  • Python 学习后如何找工作及就业方向分析
  • 基于 YOLO26 的无人机视角河道水面垃圾检测系统
  • OSCP 实战笔记:获取并破解 Net-NTLMv2 哈希(下)
  • C++ 继承机制详解与实战
  • Android 开发工程师面试核心知识点与准备指南
  • C++ 随机生成 RxC 列联表及源码实现
  • 基于 YOLOv5 的智能目标检测与自动锁定系统
  • C++ 哈希表封装 myunordered_map 与 unordered_set:底层原理及实现
  • 前端API设计最佳实践:让你的API更优雅
  • 基于 Selenium+Python 自动获取登录态 Cookie 的三种实战方案
  • Python 和 C++ 的性能差距,到底有多大
  • HarmonyOS 6 相机 C++ API 核心能力与 NDK 开发
  • JavaShop 新零售电商系统架构与核心功能解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online