Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解锁动态规划的奥秘:从零到精通的创新思维解析(8)

解锁动态规划的奥秘:从零到精通的创新思维解析(8)

作者头像
用户11295429
发布于 2025-04-16 05:30:21
发布于 2025-04-16 05:30:21
10100
代码可运行
举报
文章被收录于专栏:王的博客专栏王的博客专栏
运行总次数:0
代码可运行

前言:

小编在前几日讲述了关于动态规划的习题,下面小编继续跟着上次的步伐,继续进入多状态dp问题的讲解(但是今天这个题目不需要多状态),今天由于小编的精力有限,所以我就仅仅先讲述一个题目,等小编过几天精力恢复过来就给各位正常的每日两题的讲解。

1.粉刷房子

1.1.题目来源

本题和前面的大多数题目一样,都是来自于力扣,下面小编给出相关的链接:LCR 091. 粉刷房子 - 力扣(LeetCode)

1.2.题目分析

本题目虽然比较长,但是理解起来还是比较容易的,首先我们面前有n个房子,每个房子都需要被粉刷,此时给予了我们三个颜料进行选择,分别是红色,蓝色,绿色。此时我们有一个规定:相邻的房子是不可以被粉刷同一个颜色的,并且每一个房子粉刷的漆的价格都是不一样的,现在给定我们一排房子,让我们去选择哪一个房子应该选择哪一个颜料,从而使得我们粉刷完所有的房子以后,其成本花费的最少,其实细看,这个题目就类似我们之前讲述的打家劫舍问题,只不过和之前不同的是,这个题目让我们提供的选择有三种,所以按理来说我们需要使用到三个dp表来实现,只不过本题目巧妙的用一个二维的数组来帮助我们解决开辟太多dp表的问题,如果想要知道如何用二维数组代替三个dp表,且听我下面的思路分析娓娓道来。

1.3.思路讲解

此时我们不难看出·,我们需要用到三个dp表实现这个题目,只不过dp表过多会导致代码写起来复杂程度上升,所以为了解决这个问题,我们可以用一个二维dp表来代替一维dp表,其中dp表的每一行表示每一个房子,其中的每一列代表的是对应的颜料,本题已经说明了每一列代表的颜料是啥了:0代表红色,1代表蓝色,2代表绿色。此时我们根据所设置好的dp表,就可以根据动态规划的五步走来实现本题目的思路分析。

1.状态表示

此时我们把设置好的表叫做dp表,其中行表示每一个房子,列表示选取的颜料,此时的dp[i] [j]到达i位置的时候,涂上j色颜料,由于本题目颜料有限,小编就把这几种状态直接列出来了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dp[i][0];  //到达i位置的时候,涂上红色,此时最少的花费成本。
dp[i][1];  //到达i位置的时候,涂上蓝色,此时最少的花费成本。
dp[i][2];  //到达i位置的时候,涂上绿色,此时最少的花费成本。
2.状态转换方程

此时我们根据上面的思路讲解以及状态表示,就可以轻易的求取此时的状态转换方程,此时我们如果在i位置选取了红色颜料,那么它的前一个房子仅仅可以选取绿色或者蓝色(其中最小的);同样的,如果我们选取了蓝色颜料,那么它的前一个房子仅仅可以选择红色,绿色(其中最小的);如果我们选取了绿色颜料,那么它的前一个房子仅仅可以选取红色,蓝色(其中最小的),根据此,我们就可以分别列出三个状态转换方程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dp[i][0] = cost[i][0] + min(dp[i - 1][1],dp[i - 1][2]);
dp[i][1] = cost[i][1] + min(dp[i - 1][0],dp[i - 1][2]);
dp[i][2] = cost[i][2] + min(dp[i - 1][1],dp[i - 1][0]);
3.初始化

此时初始化问题依然是我们需要关注的细节问题,此时我们可以知道当我们选取第一行元素的时候,就会出现越界的情况,所以针对于这种情况,小编的建议就是通过创建虚拟结点,即多创建一行来抵消越界的问题,此时我们让新创立的一行为0即可,只要它不印象结果,那么多创立一行也是无妨的。

4.填表顺序

从上到下,从左到右。

5.返回值

返回表中最后一行的三列中最小的那一个即可。

1.4.代码讲解

此时我们需要先设置好一个dp表,此时要比题目提供的数组的行数多一个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int m = costs.size(),n = costs[0].size();
vector<vector<int>> f(m + 1,vector<int>(n,0));

之后我们根据状态转换方程进行填表即可。此时一定要注意下标的映射问题,此时我们比之前要多出一行,所以当我们使用数组元素的时候,我们需要让相应行减一。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(int i = 1 ; i <= m ; i++)
 {
    f[i][0] = min(f[i - 1][1],f[i - 1][2]) + costs[i - 1][0];
    f[i][1] = min(f[i - 1][0],f[i - 1][2]) + costs[i - 1][1];
    f[i][2] = min(f[i - 1][1],f[i - 1][0]) + costs[i - 1][2];
 }

此时我们返回最后一行最小的一个元素即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return min(min(f[m][0],f[m][1]),f[m][2]);
1.5.完整代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
         int m = costs.size(),n = costs[0].size();
         vector<vector<int>> f(m + 1,vector<int>(n,0));
         for(int i = 1 ; i <= m ; i++)
         {
            f[i][0] = min(f[i - 1][1],f[i - 1][2]) + costs[i - 1][0];
            f[i][1] = min(f[i - 1][0],f[i - 1][2]) + costs[i - 1][1];
            f[i][2] = min(f[i - 1][1],f[i - 1][0]) + costs[i - 1][2];
         }
         return min(min(f[m][0],f[m][1]),f[m][2]);
    }
};

2.总结

本文到这里也就结束了,可能很多读者朋友觉着小编今天写的题目比较少,这里小编再次统一解释一下原因:小编最近在期末周,所以精力有限,虽然在我写这篇文章的时候,我已经到了期末周的尾声了,但是由于小编“一不小心”有点太放纵,导致我现在的精力有点差,所以特意写出来这一篇文章来让脑子变的有活力。一起写题的时光总是很短暂的,那么各位大佬们,我们下一篇文章见啦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态规划 —— dp 问题-粉刷房子
https://leetcode.cn/problems/JEj789/description/
迷迭所归处
2024/11/19
720
动态规划 —— dp 问题-粉刷房子
解锁动态规划的奥秘:从零到精通的创新思维解析(9)
小编在前几日写了关于动态规划中的多状态dp的问题,此时小编将会讲述一个动态规划我们常常会遇到的一类问题——股票问题,股票问题就类似小编上一篇所讲述的粉刷房子的问题,可以通过一个二维的dp表来代替多个一维的dp表。买卖股票算是一个很经典的问题了,下面小编简单介绍一下买卖股票问题。
用户11295429
2025/04/18
430
解锁动态规划的奥秘:从零到精通的创新思维解析(9)
算法训练之动态规划(五)——简单多状态问题
可以看到题目要求给房子上颜色,并且相邻的房子颜色不能相同~这显然是是一个多状态的问题,接下来我们来一步步分析一下~
用户11352420
2025/04/12
720
算法训练之动态规划(五)——简单多状态问题
【LeetCode】动态规划 刷题训练(五)
cost数组的横坐标 代表 N号房子,纵坐标 代表 颜色 在每号房子中分别选取一种颜色,但是相邻之间不能选取相同的颜色,求最小花费
lovevivi
2023/10/17
2570
【LeetCode】动态规划 刷题训练(五)
解锁动态规划的奥秘:从零到精通的创新思维解析(7)
在前几天的文章中,小编为大家讲解了动态规划中多状态 DP 问题的相关内容。今天,我们将延续上篇文章的主题,继续深入剖析多状态 DP 的解题思路和技巧。快系好安全带,准备好,我们的算法世界之旅再次启程!
用户11295429
2025/02/04
750
解锁动态规划的奥秘:从零到精通的创新思维解析(7)
解锁动态规划的奥秘:从零到精通的创新思维解析(4)
小编在前几天讲述了动态规划相关的题目,今天继续跟着上次的脚步,继续进行动态规划相关题目的讲解,下面我们一起走进动态规划的世界。
用户11295429
2025/01/03
800
解锁动态规划的奥秘:从零到精通的创新思维解析(4)
解锁动态规划的奥秘:从零到精通的创新思维解析(6)
在动态规划的众多问题中,多状态DP问题是一个非常重要的类别。它的难点在于如何设计合适的状态表示和转移方程,从而高效地解决问题。
用户11295429
2025/01/19
910
解锁动态规划的奥秘:从零到精通的创新思维解析(6)
【动态规划算法练习】day4
213. 打家劫舍 II 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。 给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
摘星
2023/10/15
1640
【动态规划算法练习】day4
解锁动态规划的奥秘:从零到精通的创新思维解析(5)
小编在前几日分享了关于动态规划的题目,今天我们继续沿着之前的思路,深入探索动态规划的魅力。今天要讲解的依旧是路径问题,与前面讲过的题目在解法上有一定相似之处。如果大家对这类题目的解法还不太熟悉,可以回顾一下之前的文章,巩固基础。话不多说,让我们进入今天的代码之旅!
用户11295429
2025/01/10
800
解锁动态规划的奥秘:从零到精通的创新思维解析(5)
解锁动态规划的奥秘:从零到精通的创新思维解析(2)
小编在前几日讲述了关于动态规划的题目,今天小编继续进行动态规划相关题目的书写,动态规划的题目相较于小编之前讲述的习题难度是蛮大的,希望各位可以克服困难,最终掌握动态规划的题,下面就进入本文的讲题环节。
用户11295429
2025/01/03
830
解锁动态规划的奥秘:从零到精通的创新思维解析(2)
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
小编在前几日书写了关于动态规划习题的博客(PS:其实这些都是我的存稿,我已经好久没写博客了截止到现在,确实摆烂),今天各位继续跟着小编的步伐,走进动态规划的世界,接下来我们将会·讲述一个比较新的动态规划问题:路径问题。
用户11295429
2025/01/03
540
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
LeetCode 256. 粉刷房子(DP)
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同。
Michael阿明
2020/07/13
1.2K0
解锁动态规划的奥秘:从零到精通的创新思维解析(10)
前几天,我写了一篇关于动态规划的文章,今天继续为大家带来一些动态规划相关的习题解析。本次分享的两道题依然围绕“股票”问题展开,不过相比之前的题目,难度有所提升。希望能为大家的学习提供帮助!
用户11295429
2025/05/02
800
解锁动态规划的奥秘:从零到精通的创新思维解析(10)
解锁动态规划的奥秘:从零到精通的创新思维解析(1)
在算法的世界里,动态规划(Dynamic Programming, DP)以其强大的问题分解与优化能力,占据着极为重要的地位。无论是在学术研究还是实际应用中,它都广泛用于解决最优子结构和重叠子问题的复杂场景。从路径规划到资源分配,从游戏策略到数据压缩,动态规划的方法论为我们提供了一把破解复杂问题的利器。然而,初学者往往会被它的理论抽象和实现细节所困扰。本文将通过一道经典动态规划习题的详细讲解,帮助大家深入理解其本质,并掌握在实际问题中如何灵活运用。希望通过这篇文章,您能对动态规划的“自顶向下”与“自底向上”有更清晰的认识,从而在算法学习的旅程中迈出扎实的一步。下面我先从几个方面介绍动态规划。
用户11295429
2024/12/20
1520
解锁动态规划的奥秘:从零到精通的创新思维解析(1)
【算法专题】动态规划之简单多状态 dp 问题
题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。 在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
YoungMLet
2024/03/01
1980
【刷题笔记】删除并获取最大点数&&粉刷房子
这道题目要求必须删除相邻的数据,和打家劫舍问题中的不能偷相邻的两家的东西非常相似。所以我们就可以将本题转化为打家劫舍问题。但是本题的数据不一定是连续的,所以我们需要预处理一步。转化成连续的。
破晓的历程
2024/09/06
830
【刷题笔记】删除并获取最大点数&&粉刷房子
【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
用户11369350
2024/12/26
870
【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型
LeetCode 265. 粉刷房子 II(DP)
假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
Michael阿明
2020/07/13
7470
每周算法:斐波那契数列模型+路径问题+简单多状态dp+子数组系列
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
啊QQQQQ
2024/11/19
1060
每周算法:斐波那契数列模型+路径问题+简单多状态dp+子数组系列
【动态规划】【简单多状态 dp 问题】按摩师、打家劫舍、删除并获得点数、粉刷房子
这题其实和“打家劫舍”问题很像,取完一个数之后,就不能取相邻的数了,还要取的值最大
椰椰椰耶
2024/11/15
1000
【动态规划】【简单多状态 dp 问题】按摩师、打家劫舍、删除并获得点数、粉刷房子
推荐阅读
相关推荐
动态规划 —— dp 问题-粉刷房子
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验