动态规划学习——多状态dp(打家劫舍问题)

一,打家劫舍I

题目:

一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

题目接口:

class Solution {
public:int rob(vector<int>& nums) {}
};

解题思路及代码:

这个打家劫舍问题便是经典的多状态dp问题。为什么是多状态dp问题呢?

1.首先这道题要我们求得是最大值,并且第i家的最大值其实是由前面的前i-1家推导出来的,所以这个问题可以是一个dp问题。

2.为什么1是个多状态dp问题呢?首先我们知道,我们第i天的最大值是由前面的i-1家推导出来的。但是前面的i-1家里面的每一天其实都有偷与不偷两种状态。所以综上两点我们的这道题目便是一个多状态dp问题了。

解决这种dp问题的第一步便是画出状态转移的图表示,如下:

首先解释一下箭头,箭头的开始表示的是前一家的状态,箭头的结束表示这一家的状态。

所以要变成这一家不偷的状态便有两种情况:1.上一家偷了,这一家我不偷

                                                                     2.上一家没偷,这一家我还是不偷。

今天变成偷的状态:上一家没偷,这一家偷。(上一家偷了,这一家就不能偷了。题目要求)

有了这一个状态转移关系以后,我们便可以开始我们的题目解答了,代码如下:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();//定义两个数组分别代表第i家偷了和没偷的最大值,f表示偷了,g表式没偷vector<int>f(n);auto g = f;//初始化f[0] = nums[0];//第一家偷了g[0] = 0;//第一家没偷//根据状态转移图填表for(int i = 1;i<n;i++){f[i] = g[i-1]+nums[i];//上一家没偷,这一家才能偷g[i] = max(g[i-1],f[i-1]);//不管上一家偷不偷,这一家都不偷,取前面一家在两种状态下的最大值。}return max(g[n-1],f[n-1]);//返回每一家都到访后的最大值}
};

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

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

相关文章

RocketMQ(一):基本概念和环境搭建

Spring源码系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 目录 一、RocketMQ简介二、各个MQ产品的比较三、RocketMQ重要概念1、基本概念2、消息从发送到被消费的的流程3、生产和消费理解 四、RocketMQ安装1、下载RocketMQ2、解压并配置环境变量3、修改nameServer的运行…

wordcloud出现ValueError: Only supported for TrueType fonts

方法1&#xff1a;换一个版本的wordcloud即可&#xff0c;实测windows在1.8.2.2版本上不会报错。 方法2&#xff1a;还可以尝试其他博客中的解决方案&#xff0c;自己下个字体的TTF文件&#xff0c;让后font_path直接写字体文件路径。&#xff08;此方法未见效&#xff09;

【Python 算法】双向迪杰斯特拉算法 Python实现

双向迪杰斯特拉算法Python实现 文章目录 双向迪杰斯特拉算法Python实现简介双向迪杰斯特拉算法优势局限性算法的基本步骤终止条件 基本步骤伪代码Python 实现双向迪杰斯特拉与单向迪杰斯特拉算法比较 简介 双向迪杰斯特拉算法&#xff08;Bi Directional Dijkstra Algorithm&a…

解析SQL 获取表、字段及SQL查询参数

解析SQL 获取表、字段及SQL查询参数 1. 执行效果2. 使用2.1 引入依赖2.2 相关实体2.3 工具类 1. 执行效果 2. 使用 2.1 引入依赖 <!-- sql 解析处理--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifa…

【读点论文】结构化剪枝

结构化剪枝 在一个神经网络模型中&#xff0c;通常包含卷积层、汇合层、全连接层、非线形层等基本结构&#xff0c;通过这些基本结构的堆叠&#xff0c;最终形成我们所常用的深度神经网络。 早在 1998 年&#xff0c;LeCun 等人使用少数几个基本结构组成 5 层的 LeNet-5 网络&…

docker简介和安装

0.前提 本文章意在告诉各位开发者学生有一个工具能够方便你未来的项目开发和部署&#xff0c;这也是我在给我留下一份备份&#xff0c;在我忘记的时候可以回头寻找。 1.docker简介 docker本身就有集装箱的意思。Docker: Accelerated Container Application Development Dock…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

Java Stream 的使用

Java Stream 的使用 开始中间操作forEach 遍历map 映射flatMap 平铺filter 过滤limit 限制sorted 排序distinct 去重 结束操作collect 收集toList、toSet 和 toMapCollectors.groupingByCollectors.collectingAndThen metch 匹配find 查询findFirst 与 findAny 的使用Optional …

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

SpringBoot3数据访问

SpringBoot3数据访问 SpringBoot整合 Spring、SpringMVC、MyBatis进行数据访问开发。 整合SSM场景 整合步骤 1、创建SSM整合项目 ①数据库准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint NOT NULL AUTO_INCREMENT COMMENT 编号,login_name varchar(200)…

[Linux]tcpdump抓包工具

windows中的抓包工具&#xff1a;wireshark linux中的抓包工具&#xff1a;tcpdump cpdump是Linux系统中自带抓包工具 [rootIKUN ~]# rpm -q tcpdump tcpdump-4.9.0-5.el7.x86_64 [rootIKUN ~]# tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.1…