当前位置: 首页 > news >正文

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

文章目录

      • [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子
        • 题目解析
          • 解题思路
          • 状态表示
          • 状态转移方程
          • 初始化和填表顺序
          • 返回值
        • 代码实现
        • 总结

LCR 091. 粉刷房子

image-20231108205030592

题目解析

(1) 一排房子,共有n个

(2) 染红色、蓝色和绿色,且相邻两个房子颜色不能相同

(3) 不同颜色的价格用cost数组表示,大小为n*3

(4) cost[0] [0],0表示染红色的价格、cost[1] [2], 2表示染绿色的价格,剩下的1则表示染蓝色的价格

(5) 求出最小价格

示例1:

image-20231108205916958

解题思路
状态表示

按照以往的经验,我们就取以i为终点,所花费的最小的价格

本题的开始有三种不同的染法,第一个位置可以染红色、蓝色或者绿色。

所以dp[i] [0]:表示第一个位置染红色,到i位置的最小价格

dp[i] [1]:表示第一个位置染蓝色,到i位置的最小价格

dp[i] [2]:表示第一个位置染绿色,到i位置的最小价格

状态转移方程

当我们第i个位置染了红色,那么i-1位置就是取蓝色或者绿色的最小价格

所以dp[i] [0] 为到i-1位置两种颜色的较小值加上对应的i位置染红色的价格

所以,可以得出三个状态转移方程

dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + cost对应i位置染红色的价格
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + cost对应i位置染蓝色的价格
dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + cost对应i位置染绿色的价格
初始化和填表顺序
  • 初始化

我们已经确定了三个初始时分别染红色、蓝色和绿色,填上价格即可。

  • 填表顺序

三个位置同时从左到右填即可。

返回值

返回三个染法的最小值即可。

看到这里,我们可以自己尝试实现代码,再来看下面的内容。


代码实现
class Solution {
public:int minCost(vector<vector<int>>& costs) {//创建dp数组int n = costs.size();vector<vector<int>> dp(n+1, vector<int>(3));//初始化//填表for(int i = 1; i <= n; i++){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];//绿色}//返回值return min(dp[n][0], min(dp[n][1], dp[n][2]));}
};

image-20231108211125272

总结

细节1:在填表的过程中,会帮我们一并填上0对应位置的价格,所以我们在循环外边不用手动初始化。

细节2:注意下标之间的对应关系,我们从1开始,但是cost表是从0开始的。

细节3:返回值是三者中的最小值。

相关文章:

  • Oracle(14) Managing Password Security and Resources
  • 项目管理之如何出道(上)
  • Vue3.0路由拦截
  • VBA根据Excel内容快速创建PPT
  • falsk框架中安装flask-mysqldb报错解决方案
  • html将复选框变为圆形样例
  • SpringBoot集成-阿里云对象存储OSS
  • java进程内存分析工具-生成core dump文件,并读取分析:jmap, jhat
  • 如何在 Vue.js 中引入原子设计?
  • Redis主从配置和哨兵模式
  • git命令行操作
  • win10下.net framework 3.5 | net framework 4 无法安装解决方案
  • Apache Doris (五十一): Doris数据缓存
  • 计算机组成原理平时作业一
  • 移远EC600U-CN开发板 day01
  • 【Leetcode】101. 对称二叉树
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Django 博客开发教程 16 - 统计文章阅读量
  • Git的一些常用操作
  • Intervention/image 图片处理扩展包的安装和使用
  • java2019面试题北京
  • Python语法速览与机器学习开发环境搭建
  • react 代码优化(一) ——事件处理
  • sublime配置文件
  • vue-cli3搭建项目
  • 基于HAProxy的高性能缓存服务器nuster
  • 模型微调
  • 前嗅ForeSpider中数据浏览界面介绍
  • 入手阿里云新服务器的部署NODE
  • 深度学习中的信息论知识详解
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Nginx实现动静分离
  • 移动端高清、多屏适配方案
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #include
  • (6)STL算法之转换
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (zt)最盛行的警世狂言(爆笑)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (蓝桥杯每日一题)love
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Scala的“=”符号简介
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET NPOI导出Excel详解
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET中使用Redis (二)
  • @Builder用法
  • @ConditionalOnProperty注解使用说明
  • @javax.ws.rs Webservice注解