「动态规划」如何求粉刷房子的最少花费?

LCR 091. 粉刷房子icon-default.png?t=N7T8https://leetcode.cn/problems/JEj789/description/

假如有一排房子,共n个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个n x 3的正整数矩阵costs来表示的。例如,costs[0][0]表示第0号房子粉刷成红色的成本花费;costs[1][2]表示第1号房子粉刷成绿色的花费,以此类推。请计算出粉刷完所有房子最少的花费成本。

  1. 输入:costs = [[17,2,17],[16,16,5],[14,3,19]],输出:10,解释:将0号房子粉刷成蓝色,1号房子粉刷成绿色,2号房子粉刷成蓝色。最少花费:2 + 5 + 3 = 10。
  2. 输入:costs = [[7,6,2]],输出:2

提示:costs.length == n,costs[i].length == 3,1 <= n <= 100,1 <= costs[i][j] <= 20。


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,我们用dp[i]表示粉刷完i位置的房子后,此时的最少花费。这可以细分为:

  • 用dp[i][0]表示:将i位置的房子粉刷成红色之后的最少花费。
  • 用dp[i][1]表示:将i位置的房子粉刷成蓝色之后的最少花费。
  • 用dp[i][2]表示:将i位置的房子粉刷成绿色之后的最少花费。

简单来说,在dp[i][j]中,i表示最后一个粉刷的房子的编号;j表示最后一个粉刷的房子中,粉刷的颜色的编号;dp[i][j]表示此时的最少花费

推导状态转移方程:我们考虑最近的一步,即粉刷完i - 1位置的房子之后的情况。

  • 考虑dp[i][0]。把i位置的房子粉刷成红色,所以只能把i - 1位置的房子粉刷成蓝色或者绿色。那么,把i位置的房子粉刷成红色之后的最少花费,就应该是把i - 1位置的房子粉刷成蓝色或者绿色之后的最少花费,两种情况的较小值,再加上把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][0], dp[i - 1][1]) + costs[i][2]。

综上所述: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][0], dp[i - 1][1]) + costs[i][2]

初始化:根据状态转移方程,在计算dp[0][j],其中j的范围是[0, 2]时,会发生越界访问,所以要进行相应的初始化。

  • dp[0][0]表示把0位置的房子粉刷成红色后,此时的最少花费,显然dp[0][0] = costs[0][0]。
  • 同理dp[0][1] = costs[0][1],dp[0][2] = costs[0][2]。

综上所述:dp[0][0] = costs[0][0],dp[0][1] = costs[0][1],dp[0][2] = costs[0][2]

当然,我们可以在最前面添加一个辅助结点dp[0][j] = 0,其中j的范围是[0, 2]。这样,根据状态转移方程,以dp[i][0]为例,此时min(dp[0][1], dp[0][2]) = 0,辅助结点的值不影响结果,符合预期。

填表顺序:根据状态转移方程,对于dp[i][j]只依赖于dp[i - 1][j],j的范围是[0, 2]。那么,我们只需要从左往右填表

返回值:由于不确定把最后一个房子粉刷成什么颜色,根据状态表示,最终应返回把最后一个房子粉刷成红色、蓝色或者绿色这3种情况中,最少花费的最小值,即dp[n][j]的最小值,其中j的范围是[0, 2]。

细节问题:由于新增了一个辅助结点,此时dp表的规模就不是n x 3,而是(n + 1) x 3。同时需注意下标的映射关系,dp[i][j]对应的是costs[i - 1][j]

时间复杂度:O(N),空间复杂度:O(N)。

class Solution {
public:int minCost(vector<vector<int>>& costs) {int n = costs.size();// 创建dp表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]));}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过 CartPole 游戏详细说明 PPO 优化过程

CartPole 介绍 在一个光滑的轨道上有个推车&#xff0c;杆子垂直微置在推车上&#xff0c;随时有倒的风险。系统每次对推车施加向左或者向右的力&#xff0c;但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 1 的奖励。但是当杆子与垂直方向成 15 度以上的…

springboot与flowable(1):介绍、Flowable-ui使用

一、工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能&#xff0c;一个最常见的例子是请假加班申请与审批的过程。事实上&#xff0c;工作流引擎能支持的业务场景远远不止单据审批&#xff0c;几乎所有涉及到业务流转、多人按流程完成工作的场景背后都可以通过工作流…

任务4.8.1 利用Spark SQL实现词频统计

实战&#xff1a;利用Spark SQL实现词频统计 目标 使用Apache Spark的Spark SQL模块&#xff0c;实现一个词频统计程序。 环境准备 本地文件准备 在本地/home目录下创建words.txt文件。 HDFS文件准备 创建HDFS目录/wordcount/input。将words.txt文件上传到HDFS的/wordcount…

在 Visual Studio 2022 中配置 OpenCV

在 Visual Studio 2022 中配置 OpenCV 软件准备系统环境配置VS 2022 环境配置测试 软件准备 Visual Studio 2022 下载链接 OpenCV 下载链接 Visual Studio 的版本与 OpenCV 的 vc 版本需对应好&#xff0c;可以向下兼容&#xff1a; VS 2015 – vc14VS 2017 – vc15VS 2019…

【启明智显芯片应用】Model3C芯片4.3寸拼图机应用方案

数据显示&#xff0c;618前期&#xff0c;早教启智、智能玩具、科学启蒙、数字阅读类产品销量增长迅猛。当下&#xff0c;90后新生代父母对于孩子的科学启蒙教育愈发重视&#xff0c;他们在给孩子选择学习产品时&#xff0c;越来越倾向于选择寓教于乐的益智类产品&#xff0c;而…

PNAS | 工作记忆中大脑节律的因果功能图

摘要 工作记忆是一个涉及大脑中多个功能解剖节点的关键认知过程。尽管有大量与工作记忆结构相关的神经影像学证据&#xff0c;但我们对控制整体表现的关键中枢的理解并不完整。因果解释需要在对特定功能解剖节点进行安全、暂时和可控的神经调节后进行认知测试。随着经颅交流电…

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加&#xff0c;制造业对于生产线稳定性和效率的要求不断提高。然而&#xff0c;传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题&#xff0c;迫切需要一种更具灵活性和效率的监控方式。…

充电宝哪个牌子好?10款主流款充电宝推荐

步入高速发展的快充时代&#xff0c;一个优质的充电宝已成为我们日常生活中的必备良品。本文将为大家介绍10主流款的充电宝品牌&#xff0c;它们包括西圣PB、品胜、京东京造、京东京造、飞利浦、倍思等知名品牌的系列产品。这些充电宝涵盖了不同的容量和快充协议&#xff0c;能…

redis windos修复版本

遇到的问题: Django的channel插件连接安装在windows上的redis报错: unknown command BZPOPMIN, channels-redis版本和redis不兼容导致.解决方案: 更新Redis版本. 微软官方维护的 Redishttps://github.com/microsoftarchive/redis/releases 2016年后就不更新了, 版本停留在了3.x…

2024年城市建设、运输与智慧交通国际会议(ICUCTST 2024)

2024 International Conference on Urban Construction, Transportation, and Smart Transportation 【1】大会信息 会议简称&#xff1a;ICUCTST 2024 大会地点&#xff1a;中国厦门 会议官网&#xff1a;www.icuctst.com 投稿邮箱&#xff1a;icuctstsub-paper.com 【2】会…

【论文】2405.Phased Consistency Model(港中文提出了AI绘画加速模型,一步采样生成图像,支持SD1.5,SDXL)

论文&#xff1a;https://arxiv.org/abs/2405.18407 &#xff08;2024.05.30发布&#xff09; 代码&#xff1a;https://github.com/G-U-N/Phased-Consistency-Model 一、论文要解决什么问题&#xff1f;效果如何&#xff1f; (需要先了解LCM模型) (阶段性一致性模型:朝着稳定…

后端面试题分享查看测试代码

问题描述 编写一个函数&#xff0c;该函数接受一个字符串作为参数&#xff0c;检查该字符串是否符合密码强度要求&#xff0c; 返回True或False。 要求 密码强度要求如下&#xff1a; 不能小于6个字符必须出现大写、小写、数字、特殊字符&#xff08;!#$%^&*_-&#xf…

(免费领源码)基于 node.js#vue#mysql的网上游戏商城35112-计算机毕业设计项目选题推荐

摘 要 本论文主要论述了如何使用node.js语言开发一个基于vue的网上游戏商城&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;本系统采用的数据库是Mysql&#xff0c;使用node.js的koa技术技术构建的一个管理系统&#xff0c;实现了本系统的全部功能。在…

Java--Math类和Random类

1.Math类简介 1.Math类中提供了大量用于数学运算的相关方法。 2.Math类是使用final修饰的终结类&#xff0c;不能产生子类 3.Math类中的方法都是static修饰的静态方法&#xff0c;可以通过类名.方法名直接调用 2.Math常用方法 1.abs(int)&#xff1a;求绝对值(int,long,floa…

ABB机器人修改IO信号的具体方法介绍

ABB机器人修改IO信号的具体方法介绍 具体步骤可从参考以下内容: 导出IO配置文件 打开【控制面板】-【配置】-【I/O System】-【文件】-【‘EIO’另存为】,就可以保存IO配置文件【EIO.cfg】用RobotStudio软件打开EIO.cfg文件在软件界面,鼠标右击,选择【I/O信号数据编辑器】选…

【MyBatis-plus】saveBatch 性能调优和【MyBatis】的数据批量入库

总结最优的两种方法&#xff1a; 方法1&#xff1a; 使用了【MyBatis-plus】saveBatch 但是数据入库效率依旧很慢&#xff0c;那可能是是因为JDBC没有配置&#xff0c;saveBatch 批量写入并没有生效哦&#xff01;&#xff01;&#xff01; 详细配置如下&#xff1a;批量数据入…

数据结构---外部排序

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

【计算机毕业设计】266基于微信小程序的在线点餐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Nature子刊】最争气国人友好“灌水刊”,中科院3区升2区,录用仅1个月,2天见刊!

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

【单片机毕业设计9-基于stm32c8t6的酒窖监测系统】

【单片机毕业设计9-基于stm32c8t6的酒窖监测系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇9基于stm32的酒窖监测系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -------------------…