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

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

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

——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];}
};

结果展示

解法一解法二

相关文章:

  • 2024年【四川省安全员A证】试题及解析及四川省安全员A证模拟考试
  • SpringBoot3.3集成knif4j-swagger文档方式和使用案例
  • 前端初学java二(类、多态、接口、内部类、泛型)
  • 使用shell脚本进行clang-tidy静态代码分析
  • 【鸿蒙学习笔记】基础组件 Button
  • 可重入锁思想,设计MQ迁移方案
  • 高考文化课|高三这些高效学习方法你了解了吗?
  • adb热更新
  • SpringMVC的基本使用
  • Spring Data与多数据源配置
  • 《昇思25天学习打卡营第9天|onereal》
  • adb shell logcat -b all|grep如何可以grep两个子串?
  • Rust Eq 和 PartialEq
  • 第三节:如何理解Spring的两个特性IOC和AOP(自学Spring boot 3.x第一天)
  • 嵌入式学习(Day 51:ARM指令/汇编与c语言函数相互调用)
  • Babel配置的不完全指南
  • go append函数以及写入
  • IDEA 插件开发入门教程
  • java 多线程基础, 我觉得还是有必要看看的
  • leetcode46 Permutation 排列组合
  • PHP变量
  • Python中eval与exec的使用及区别
  • SQLServer之创建显式事务
  • Sublime text 3 3103 注册码
  • 构建二叉树进行数值数组的去重及优化
  • 将 Measurements 和 Units 应用到物理学
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • mysql面试题分组并合并列
  • 昨天1024程序员节,我故意写了个死循环~
  • #《AI中文版》V3 第 1 章 概述
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (70min)字节暑假实习二面(已挂)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (动态规划)5. 最长回文子串 java解决
  • (三)c52学习之旅-点亮LED灯
  • (三)mysql_MYSQL(三)
  • (转载)(官方)UE4--图像编程----着色器开发
  • ../depcomp: line 571: exec: g++: not found
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .net core 连接数据库,通过数据库生成Modell
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BSGS算法]纯水斐波那契数列
  • [Bug]使用gradio创建应用提示AttributeError: module ‘gradio‘ has no attribute ‘inputs‘
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [CCF-CSP] 202303-4 星际网络II
  • [DL]深度学习_Feature Pyramid Network
  • [Flexbox] Using order to rearrange flexbox children