• 【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(76)


    1. 题目解析

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

    这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

    2.算法原理

    1. 状态定义

    在解决这类问题时,我们首先需要根据题目的具体要求来定义状态。针对房屋粉刷问题,我们可以定义一个二维数组dp来表示状态,其中dp[i][j]表示粉刷到第i个位置时,且最后一个位置粉刷成颜色jj可以是红、蓝、绿三种颜色)时的最小花费。

    • dp[i][0]:表示粉刷到第i个位置时,最后一个位置粉刷成红色的最小花费。
    • dp[i][1]:表示粉刷到第i个位置时,最后一个位置粉刷成蓝色的最小花费。
    • dp[i][2]:表示粉刷到第i个位置时,最后一个位置粉刷成绿色的最小花费。
    2. 状态转移方程

    接下来,我们需要根据题目要求来推导状态转移方程。由于题目中规定了相邻位置不能粉刷成相同的颜色,因此在计算dp[i][j]时,我们需要考虑i-1位置的颜色,并确保与j不同。

    • 对于dp[i][0](即第i个位置粉刷成红色):
      • 由于不能与前一个位置颜色相同,所以前一个位置可以是蓝色或绿色。因此,状态转移方程为:dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + costs[i-1][0],其中costs[i-1][0]表示第i-1个位置粉刷成红色的花费。
    • 同理,对于dp[i][1]dp[i][2],我们也可以得到相应的状态转移方程:
      • 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]
    3. 初始化

    在填表之前,我们需要对状态数组进行初始化。由于题目没有明确指出第一个位置之前的颜色,我们可以添加一个辅助节点,并将所有颜色在该节点的花费初始化为0(或者一个不会影响后续计算的值)。这样做可以确保我们的状态转移方程在i=1时也能正确工作。

    4. 填表顺序

    根据状态转移方程,我们可以发现每个状态dp[i][j]都依赖于前一个位置的状态dp[i-1][k](其中k不等于j)。因此,我们需要按照从左到右的顺序来填表,以确保在计算每个状态时,其依赖的状态已经被计算出来。

    5. 返回值

    最后,我们需要返回粉刷完整个房屋(即最后一个位置)时的最小花费。由于我们定义了三种颜色的状态,因此需要比较这三种颜色在最后一个位置的最小花费,并返回其中的最小值。即:min(dp[n][0], min(dp[n][1], dp[n][2])),其中n是房屋的总位置数。

    3.代码编写

    1. class Solution {
    2. public:
    3. int minCost(vectorint>>& costs) {
    4. int n = costs.size();
    5. vectorint>> dp(n + 1, vector<int>(3));
    6. for (int i = 1; i <= n; i++) {
    7. dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
    8. dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
    9. dp[i][2] = min(dp[i - 1][1], dp[i - 1][0]) + costs[i - 1][2];
    10. }
    11. return min(dp[n][0], min(dp[n][1], dp[n][2]));
    12. }
    13. };

    The Last

    嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

    觉得有点收获的话,不妨给我点个吧!

    如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

  • 相关阅读:
    文件系统XFS与EXF4的区别
    InternImage
    微信小程序实现腾讯地图
    k8s deployment服务回滚,设置节点为不可调度
    985大学本科毕业后,许多同学都选择考公务员或进入事业单位工作,渴望拥有铁饭碗工作。而“我”选择了【软件测试】
    机械转行网络安全自学经历,零基础学网络安全,血泪总结的干货
    哈希表
    【开发心得】三步本地化部署llama3大模型
    批发行业进销存-webview 读取NFC,会员卡 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
    挂脖式运动蓝牙耳机推荐,目前适合运动佩戴的五款耳机推荐
  • 原文地址:https://blog.csdn.net/m0_73150338/article/details/138845609