算法---动态规划练习-8(打家劫舍2)

打家劫舍2

  • 1. 题目解析
  • 2. 讲解算法原理
  • 3. 编写代码

1. 题目解析

题目地址:点这里

在这里插入图片描述

2. 讲解算法原理

在这里插入图片描述


  1. 首先,给定一个非负整数数组 nums,其中 nums[i] 表示第 i 家的财物价值。

  2. 定义两个辅助数组 f 和 g,长度都为 n(n 是数组 nums 的长度)。

    • 数组 f 表示在偷盗范围为 [left, right] 内,且必须偷最后一家的情况下能够获取的最大财物价值。
    • 数组 g 表示在偷盗范围为 [left, right] 内,且不偷最后一家的情况下能够获取的最大财物价值。
  3. 定义函数 rob_s,参数为 left、right 和 nums,表示在偷盗范围为 [left, right] 内计算可以获取的最大财物价值。

  • 初始化数组 f 和 g 的第一个元素
    • f[left] = nums[left],表示在偷盗范围 [left, right] 内偷盗第一家,最大财物价值为第一家的价值
    • g[left] = 0,表示在偷盗范围 [left, right] 内不偷盗第一家,最大财物价值为0
  • 从 left+1 开始,从左到右遍历数组 nums,计算在偷盗范围 [left, right] 内的最大财物价值:
    • 对于第 i 家,如果选择偷盗,则最大财物价值为前一家不偷盗的最大财物价值 g[i-1] 加上第 i 家的财物价值 nums[i],即 f[i] = g[i-1] + nums[i]。
    • 对于第 i 家,如果选择不偷盗,则最大财物价值为前一家偷盗和不偷盗的最大财物价值中的较大值,即 g[i] = max(g[i-1], f[i-1])。
  • 返回在偷盗范围 [left, right] 内的最大财物价值,即 max(f[right], g[right])。
  1. 在 rob 函数中,首先判断特殊情况
  • 如果数组 nums 的长度为1,则直接返回第一家的财物价值。
  • 如果数组 nums 的长度为2,则返回两家财物价值中的较大值。
  1. 对于一般情况,分两种情况计算最大财物价值:
  • 情况一:偷盗第一家,但不能偷盗最后一家。对范围 [2, n-2] 进行一次打家劫舍(使用函数 rob_s),再加上第一家的财物价值 nums[0],即 ret1 = rob_s(2, n-2, nums) + nums[0]
  • 情况二:不偷盗第一家,对范围 [1, n-1] 进行一次打家劫舍(使用函数 rob_s),即 ret2 = rob_s(1, n-1, nums)
  1. 返回两种情况下的最大财物价值,即 max(ret1, ret2)

3. 编写代码

class Solution {
public:int rob_s(int left,int right,vector<int>& nums){int n=nums.size();vector<int> f(n);vector<int> g(n);f[left]=nums[left],g[left]=0;for(int i=left+1;i<=right;i++){f[i]=g[i-1]+nums[i];g[i]=max(g[i-1],f[i-1]);}return max(f[right],g[right]);}int rob(vector<int>& nums) {int n=nums.size();//处理特殊情况if(n==1) return nums[0];else if(n==2) return max(nums[0],nums[1]);vector<int> f(n);vector<int> g(n);//情况一:偷第一家,就不能偷最后一家->对[2,n-2]进行一次打家劫舍1再+nums[0]就行int ret1=rob_s(2,n-2,nums)+nums[0];//情况二:不偷第一家,对[1,n-1]进行一次打家劫舍1就行int ret2=rob_s(1,n-1,nums);return max(ret1,ret2);}
};

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

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

相关文章

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中&#xff0c;我们提出了FedCoin&#xff0c;一个基于区块链的点对点支付系统&#xff0c;专为联邦学习设计&#xff0c;以实现基于Shapley值的实际利润分配。在FedCoin系统中&#xff0c;区块链共识实体负责计算SV&#xff0c;并且新的区块是基于“Shapley证明”&a…

自定义类型:【结构体】

我们知道C语言中有许多的类型&#xff0c;比如char&#xff0c;short&#xff0c;int等等类型。像是这些C语言本身就支持的类型叫做内置类型&#xff0c;但是有一些复杂对象&#xff0c;只有这些类型是完全不够的。比如人&#xff0c;或者一本书。那么我们就可以自己定义一些类…

day 5|中间件

本节目标&#xff1a; 设计并实现 Web 框架的中间件(Middlewares)机制。 实现通用的Logger中间件&#xff0c;能够记录请求到响应所花费的时间&#xff0c;代码约50行 中间件是啥 我们的框架不可能理解所有的业务&#xff0c;框架只是一个空空的躯体&#xff0c;他有什么具…

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读&#xff08;MySQL默认&#xff09; 总结 mysql事务的概念 事务就是一组操作的集合&#xff0c;他是一…

多线程之并发变成高级面试题-2024

有三个线程T1,T2,T3,如何保证顺序执行 使用 join() 方法&#xff1a; 可以在每个线程内部使用 join() 方法来等待前一个线程执行完成。具体操作是在线程 T2 的 run() 方法中调用 T1.join()&#xff0c;在线程 T3 的 run() 方法中调用 T2.join()。这样可以确保 T1 在 T2 之前执…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下&#xff0c;说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导]&#xff0c;创建一个Demo工程&#xff0c;选择Stage模型 鸿蒙OS开发更多内容↓点击…

图像识别在工业检测中的应用

图像识别技术在工业检测中的应用非常广泛&#xff0c;它通过自动化的图像处理和分析&#xff0c;提高了生产效率、保证了产品质量&#xff0c;并降低了人力成本。以下是图像识别在工业检测中的一些主要应用领域&#xff1a; 缺陷检测&#xff1a;在制造业中&#xff0c;图像识…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

YOLOv9 实战指南:打造个性化视觉识别利器,从零开始训练你的专属测试集

论文地址&#xff1a;YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information GitHub&#xff1a;WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (github.com)…

定时备份mysql数据库数据--mysqldump版

前言&#xff1a;mysqldump是MySQL自带的逻辑备份工具&#xff0c;可以将整个数据库或者指定的表格导出为一个SQL脚本文件&#xff0c;可以用于数据库备份。 1、编写shell脚本 # 备份文件保存路径 backup_dir/data/mysqlbackup # 当前时间 current_timedate %Y-%m-%d-%H-%M-%S…

git 更改仓库地址

背景&#xff1a; 项目本来在A仓库进行保管&#xff0c;研发已经开发一段时间了&#xff0c;现在切换到了新的仓库B&#xff0c;研发本地如何将仓库切换到B 解决&#xff1a; # 查看远端地址 git remote -v # 查看远端仓库名 git remote # 重新设置远程仓库 git remote s…

Linux---多线程(下)

前情提要&#xff1a;Linux---多线程(上) 七、互斥 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

3.28(迭代搜索算法 + java学习总结)

迭代加深搜索 迭代加深算法是一在DFS的基础上添加搜索深度限制的搜索方法&#xff1b; 其核心思想是从深度为0的地方开始搜索&#xff0c;然后逐步加深搜索深度&#xff0c;重新搜索一遍&#xff1b;这对于那些已知答案在浅层&#xff0c;但整个树或图存在极多分支的情况&#…

Selenium自动化测试:从time.sleep到显式等待的转变

在自动化测试的神秘世界里&#xff0c;我们的英雄——Selenium驾驶者&#xff0c;面临着一个古老的难题&#xff1a;如何等待&#xff1f;当然&#xff0c;最简单的法术是time.sleep&#xff0c;但这就像用锤子敲打每一个螺丝——有时候行得通&#xff0c;但并不总是最好的选择…

【前端Vue】HR-saas中台项目开发md文档第1篇:vuex基础-介绍,vuex基础-初始化功能【附代码文档】

HR-saas中台管理项目开发完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vuex基础-介绍,vuex基础-初始化功能,vuex基础-state,vuex基础-mutations,vuex基础-actions,vuex基础-getters。项目课设计&#xff0c;人力资源的环境搭建vue-element-admin的了解和…

[flask]http请求//获取请求头信息+客户端信息

在网站中查询请求头信息&#xff0c;可以通过以下操作进行 右键然后选择检查 进入改页面后选择文档&#xff0c;刷新一下页面就好了 获取所有的请求头信息 print(request.headers, type(request.headers)) 在flask模块中&#xff0c;使用上面的输出函数就可以查看到有关于请求…

Python爬虫之pyquery和parsel的使用

三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数&#xff0c;来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…

Qt 窗口MainWindow(上)

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、多个浮动窗口&#xff08;…