动态规划——打家劫舍(C++)

news2024/10/7 20:27:51

好像,自己读的书确实有点少了。

——2024年7月2日


198. 打家劫舍 - 力扣(LeetCode)

题目描述

        你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12。

题解思路

        动态规划

        利用动态规划解题的时候,dp数组的含义都是自己定的,定好之后就需要思考自己如何实现,列出状态转移方程,题目就迎刃而解了。

 解法一

1. 定义dp数组含义;

        dp[i]表示偷取以 i 结尾的房间能够获取的最大价值。

2. 根据dp含义列出状态转移方程;

        因为小偷不能偷取连续的两个房间,那么如果偷取了第 i 个房间,第 i-1 间房间就不能偷取了,否则会触发警报,但是 i-2 以前的所有房间都是可以偷取的,所以列出状态转移方程如下:
        dp[i] = max( dp[0], dp[1], ..., dp[i - 2] ) + nums[i];

3. 确定边界条件;

        ①如果只有一个房间,那么dp[0] = nums[0];
        ②如果只有两个房间,那么dp[1] = max(nums[0], nums[1]);

4.思考实现方式;

        对于dp[i] = max( dp[0], dp[1], ..., dp[i - 2] ) + nums[i]如何实现呢?

        思考这段方程的含义:这段方程是实现每次偷取第 i 个房间的时候选取前 i-2 个房间中能够获取的最大价值,考虑利用大根堆的优先队列实现。

        因为每次都要选取前 i - 2 个中的最大值,而大根堆的堆顶元素又是整个堆的最大值,可以考虑在 i = 2时开始向优先队列中插入元素,这样就能保证每次取出堆顶元素就是前 i-2 个值中的最大值。

代码实现
class Solution {
public:
    int rob(vector<int>& nums) {
        // 利用优先队列和动态规划完成 dp[i] = max(dp[0]...dp[i-2]) + nums[i]
        // dp[i]表示偷取以i结尾的房间的最大价值和
        int len = nums.size();
        priority_queue<int> pq;
        vector<int> dp(len, 0);
        dp[0] = nums[0];

        int maxValue = nums[0];
        for(int i = 1; i < len; i++){
            if(i >= 2){
                pq.push(dp[i-2]);
            }
            if(i == 1){
                dp[i] = max(nums[i-1], nums[i]);
            }
            else{
                dp[i] = pq.top() + nums[i];
            }

            maxValue = max(maxValue, dp[i]);
        }
        return maxValue;
    }
};

解法二

1. 定义dp数组含义;

        dp[i]表示偷取前 i 个房间能够获得的最大价值;

2. 根据dp含义列出状态转移方程;

        每个房间都有偷与不偷两种可能,那么在计算dp[i]的时候就会出现两种情况;
        ①偷:dp[i] = dp[i-2] + nums[i];//不能偷连续的两个房间
        ②不偷:dp[i] = dp[i-1];//如果不偷那么当前的最大价值就是dp[i-1]的最大价值。

3. 确定边界条件;

        ①如果只有一个房间,那么dp[0] = nums[0];
        ②如果只有两个房间,那么dp[1] = max(nums[0], nums[1]);

4.思考实现方式;

        这个相对于解法一就很好实现了,利用vector容器即可。

代码实现
class Solution {
public:
    int rob(vector<int>& nums) {
        // dp[i]表示偷取前i的房间的最大价值和
        int len = nums.size();
        vector<int> dp(len, 0);
        dp[0] = nums[0];
        for(int i = 1; i < len; i++){
            if(i == 1){
                dp[i] = max(nums[0], nums[1]);
            }
            else{
                dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
            }
        }
        return dp[len-1];
    }
};

结果展示

解法一解法二

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

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

相关文章

Python特征工程 — 1.2 特征分箱

目录 1 什么是特征分箱 2 分箱的重要性及其优势 3 有监督分箱 3.1卡方分箱原理 3.2 决策树分箱 4 无监督分箱 4.1 等距分箱 4.2 等频分箱 4.3 分位数分箱 实验数据&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1yT1ct_ZM5uFLgcYsaBxnHg?pwdczum 提取码&…

JAVA期末速成库(11)第十二章

一、习题介绍 第十二章 Check Point&#xff1a;P454 12.1&#xff0c;12.9&#xff0c;12.10&#xff0c;12,12 二、习题及答案 12.1 What is the advantage of using exception handling? 12.1使用异常处理的优势是什么? 答:使用异常处理有以下优势&#xff1a; 1. 提高…

浙江建筑安全员A证2024年最新考试题库练习

46.总承包单位依法将建设工程分包给其他单位的&#xff0c;分包合同中应当明确各自的安全生产方面的权利、义务。总承包单位对分包工程的安全生产承担&#xff08;&#xff09;责任。 A.全部 B.主要 C.部分 D.连带 答案&#xff1a;D 47.实施总承报的建设工程发生事故&…

一首歌的时间 写成永远

大家好&#xff0c;我是秋意零。 就在&#xff0c;2024年6月20日。我本科毕业了&#xff0c;之前专科毕业挺有感触&#xff0c;也写了一篇文章进行记录。如今又毕业了&#xff0c;还是写一篇文章记录吧&#xff01;&#xff01; 专科毕业总结&#xff1a;大学三年总结&#xf…

编译原理1

NFA&DFA 在正规式的等价证明可以借助正规集&#xff0c;也可以通过有限自动机DFA来证明等价&#xff0c;以下例题是针对DFA证明正规式的等价&#xff0c;主要步骤是①NFA&#xff1b;②状态转换表&#xff1b; ③状态转换矩阵&#xff1b; ④化简DFA&#xff1b; 文法和语…

【关于C/C++中的scanf不能使用问题】

方法1&#xff1a;scanf_s 方法2&#xff1a;看见后面的日志了吗 CRT……&#xff1f;在第一行加上#define 日志 方法3&#xff1a;#pragma warning&#xff08;disable&#xff1a;4996&#xff09; 4996是我们的报错序号

B站、小红书崩,原因竟然是...它

B站崩&#xff01;小红书崩&#xff01; 大家好&#xff0c;我是那个在B站和小红书崩溃时&#xff0c;还在试图刷新页面的技术博主。到底是怎么一回事儿&#xff1f;今天&#xff0c;让我们一起来‘挖掘’这场技术‘灾难’的真相。 上午 10 点左右&#xff0c;微信技术群里突…

西南交通大学【算法分析与设计实验1】

实验1.4 有向图拓扑排序 实验目的 &#xff08;1&#xff09;掌握算法的自然语言描述法&#xff0c;流程图绘制方法以及伪代码描述方法。 &#xff08;2&#xff09;理解算法的执行过程。 &#xff08;3&#xff09;掌握算法的编程实现方法、调试方法及测试方法。 实验任务…

JSON JOLT常用示例整理

JSON JOLT常用示例整理 1、什么是jolt Jolt是用Java编写的JSON到JSON转换库&#xff0c;其中指示如何转换的"specification"本身就是一个JSON文档。以下文档中&#xff0c;我统一以 Spec 代替如何转换的"specification"json文档。以LHS(left hand side)代…

【AIGC X UML 落地】从UML语句到UML图形的生成,来看Agent插件的制作

上篇我们讲到如何通过多智能体实现自然语言绘制UML图。 没有看过的,可以去看下原文:《【AIGC X UML 落地】通过多智能体实现自然语言绘制UML图》 其中有一个实现重点,就是如何将 PlantUML 语句生成 UML 图片。在这里笔者是通过自定义 Agent 插件来实现这一流程。 本文,就此…

disql使用

进入bin目录&#xff1a;cd /opt/dmdbms/bin 启动disql&#xff1a;./disql&#xff0c;然后输入用户名、密码 sh文件直接使用disql&#xff1a; 临时添加路径到PATH环境变量&#xff1a;在当前会话中临时使用disql命令而无需每次都写完整路径&#xff0c;可以在执行脚本之前…

在非 antd pro 项目中使用 umi OpenAPI

大家好&#xff0c;我是松柏。自从跟着鱼皮哥使用了ant design pro中的OpenAPI插件之后&#xff0c;我已经无法忍受自己写请求后端接口的方法了&#xff0c;所以这篇文章记录一下如何在非ant design pro项目中使用OpenAPI。 安装依赖 首先我们需要安装包umijs/openapi&#x…

02归并排序——分治递归

02_归并排序_——分治_递归_ #include <stdio.h>void merge(int arr[], int l, int m, int r) {int n1 m -l 1;int n2 r -m;//创建临时数组int L[n1], R[n2];for(int i 0; i < n1; i){L[i] arr[l i];}for(int j 0; j < n2; j){R[j] arr[m 1 j];}int i …

STM32 ADC精度提升方法

STM32 ADC精度提升方法 Fang XS.1452512966qq.com如果有错误&#xff0c;希望被指出&#xff0c;学习技术的路难免会磕磕绊绊量的积累引起质的变化 硬件方法 优化布局布线&#xff0c;尽量减小其他干扰增加电源、Vref去耦电容使用低通滤波器&#xff0c;或加磁珠使用DCDC时尽…

【驱动篇】龙芯LS2K0300之红外驱动

实验目标 编写HX1838红外接收器驱动&#xff0c;根据接收的波形脉冲解码红外按键键值 模块连接 模块连接&#xff1a;VCC接Pin 2&#xff0c;GND接Pin1&#xff0c;DATA接Pin16 驱动代码 HX1838 GPIO初始化&#xff0c;申请中断&#xff0c;注意&#xff1a;GPIO48默认是给…

Spring Boot 中 PGSQL 判断打卡点是否经过轨迹优化代码,循环查询物理表修改生成临时表,向临时表插入数据后再做ST_DWithin判断

记录一下一个业务问题&#xff0c;流程是这样的&#xff0c;我现在有一个定时任务&#xff0c;5分钟执行一次&#xff0c;更新车辆打卡的情况。现在有20俩车&#xff0c;每辆车都分配了路线&#xff0c;每条路线都有打卡点&#xff0c;每个打卡点分配了不同的时间段&#xff0c…

【动态规划 前缀和】2478. 完美分割的方案数

本文涉及知识点 划分型dp 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2478. 完美分割的方案数 给你一个字符串 s &#xff0c;每个字符是数字 ‘1’ 到 ‘9’ &#xff0c;再给你两个整数 k 和 minLength 。 如…

Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题

保证主从节点一致性问题 Redis的同步方式默认是异步的&#xff0c;这种异步的同步方式导致了主从之间的数据存在一定的延迟&#xff0c;因此Redis默认是弱一致性的。 解决&#xff1a; 1.使用Redisson这样的工具&#xff0c;它提供了分布式锁的实现&#xff0c;确保在分布式环…

python自动化运维--DNS处理模块dnspython

1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包&#xff0c;他几乎支持所有的记录类型&#xff0c;可以用于查询、传输并动态更新ZONE信息&#xff0c;同事支持TSIG&#xff08;事物签名&#xff09;验证消息和EDNS0&#xff08;扩展DNS&#xff09;。在系统管理方面&a…

京东云备案流程图_云主机快速ICP备案_京东云服务器备案问题解答

京东云ICP备案流程&#xff0c;备案包括网站和APP备案&#xff0c;以及备案问题解答FAQ&#xff0c;阿腾云以京东云网站域名备案流程为例&#xff0c;先填写主办单位信息&#xff0c;选择网站备案或APP备案&#xff0c;申请授权码并验证&#xff0c;填写并上传主办单位详细信息…