【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 LCR 090. 打家劫舍 II

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
在这里插入图片描述

目录

  • 一、LCR 089. 打家劫舍
    • 1️⃣题目描述
    • 2️⃣题目解析
    • 3️⃣解题代码
  • 二、LCR 090. 打家劫舍 II
    • 1️⃣题目描述
    • 2️⃣题目解析
    • 3️⃣解题代码

一、LCR 089. 打家劫舍

点击可直接跳转到该题目

1️⃣题目描述

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

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

2️⃣题目解析

状态转移方程如下:

  • f[i] = g[i - 1] + nums[i-1]
  • g[i] = max(f[i-1],g[i-1])

状态表示:

  • f[i] 表示的是偷取前 i 个房屋中的第 i 个房屋时的最大金额。
  • g[i] 表示的是不偷取第 i 个房屋时的最大金额。

3️⃣解题代码

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1);auto g = f;for(int i = 1;i <= n;i++){f[i] = g[i - 1] + nums[i-1];g[i] = max(f[i-1],g[i-1]);}return max(f[n],g[n]);}
};

代码通过啦:
在这里插入图片描述

二、LCR 090. 打家劫舍 II

点击直接跳转到该题目

1️⃣题目描述

一个专业的小偷,计划偷窃一个环形街道上沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

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

示例1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例2:

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

示例3:

输入:nums = [0]
输出:0

注意:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

2️⃣题目解析

状态表示:

  • f[i] 表示偷盗i位置时,偷取i位置,此时的最大金额
  • g[i] 表示偷盗i位置时,不偷取i位置,此时的最大金额

这里要分两种情况进行讨论:第一种情况是打劫第一家,第二种情况就是不打劫第一家

情况1(打劫第一家):最大总金额 = nums[0] + 街道(2,n-2)的最大总金额

情况2(不打劫第一家):最大总金额 = 街道(1,n-1)的最大总金额

街道(起始位置,终止位置)的最大总金额这里完全按照打家劫舍 I的方式来求取即可。

最终返回值是两种情况的最大值。

3️⃣解题代码

示例代码1:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();int ret1 = 0,ret2 = 0;// 第一种情况:打劫第一家vector<int> f1(n + 1);vector<int> g1(n + 1);for(int i = 3;i <= n-1;i++){f1[i] = nums[i - 1] + g1[i-1];g1[i] = max(f1[i-1],g1[i-1]);}ret1 = max(f1[n-1],g1[n-1]) + nums[0];// 第二种情况:不打劫第一家vector<int> f2(n + 1);vector<int> g2(n + 1);for(int i = 2;i <= n;i++){f2[i] = nums[i - 1] + g2[i-1];g2[i] = max(f2[i-1],g2[i-1]);}ret2 = max(f2[n],g2[n]);return max(ret1,ret2);}
};

示例代码2:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();int ret = max((rob1(nums,2,n-2) + nums[0]),rob1(nums,1,n-1));return ret;}int rob1(vector<int> nums,int l,int r){if(l>r) return 0;int n = nums.size();vector<int> f(n);auto g = f; f[l] = nums[l];for(int i = l + 1 ;i <= r;i++){f[i] = nums[i] + g[i-1];g[i] = max(g[i-1],f[i-1]);}return max(f[r],g[r]);}
};

通过:
在这里插入图片描述

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

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

相关文章

【Vue3】自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (Custom Directives)。 1. 生命周期钩子函数 一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 在 <script …

GEO生信数据挖掘(三)芯片探针ID与基因名映射处理

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 处理一个探针对应多个基因 1.删除该行 2.保留分割符号前面的第一个基因 处理多个探针对应一个基因 详细代码案例一删除法 详细代码案例二 多个基因名时保留第一个基因名…

Day 04 python学习笔记

Python数据容器 元组 元组的声明 变量名称&#xff08;元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;元素4…….&#xff09; &#xff08;元素类型可以不同&#xff09; eg: tuple_01 ("hello", 1, 2,-20,[11,22,33]) print(type(tuple_01))结果&#x…

Android shape记录

之前一直觉得dataPath很好用&#xff0c;可以画各种矢量图。今天发现用shape画图也不错&#xff0c;记录一下自己用shape画的图。 一般使用shape就是定义形状、stroke边、solid内部、corners圆角等&#xff0c;代码 <?xml version "1.0" encoding "utf-8&q…

Go,从命名开始!Go的关键字和标识符全列表手册和代码示例!

目录 一、Go的关键字列表和分类介绍关键字在Go中的定位语言的基石简洁与高效可扩展性和灵活性 关键字分类声明各种代码元素组合类型的字面表示基本流程控制语法协程和延迟函数调用 二、Go的关键字全代码示例关键字全代码示例 三、Go的标识符定义基础定义特殊规定关键字与标识符…

提取PDF数据:Documents for PDF ( GcPdf )

在当今数据驱动的世界中&#xff0c;从 PDF 文档中无缝提取结构化表格数据已成为开发人员的一项关键任务。借助GrapeCity Documents for PDF ( GcPdf )&#xff0c;您可以使用 C# 以编程方式轻松解锁这些 PDF 中隐藏的信息宝藏。 考虑一下 PDF&#xff08;最常用的文档格式之一…

安装matplotlib_

安装pip 安装matplotlib 安装完毕 导入出现bug......

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)

一、声明 只实现物理反弹的效果&#xff0c;不实现蹦床会有的视觉拉伸效果&#xff0c;请自行找相关代码 二、实现 经过我的实践&#xff0c;我发现要想实现一个平台反弹的效果&#xff0c;要么就选择给player添加一个物理材质&#xff08;平台加了没用&#xff09;&#xff0…

【项目开发 | C语言项目 | C语言薪资管理系统】

本项目是一个简单的薪资管理系统&#xff0c;旨在为用户提供方便的员工薪资管理功能&#xff0c;如添加、查询、修改、删除员工薪资信息等。系统通过命令行交互界面与用户进行交互&#xff0c;并使用 txt 文件存储员工数据。 一&#xff0c;开发环境需求 操作系统&#xff1a;w…

多通道反向字典模型

方法 将单词的definition embedding输入Bi-LSTM模型&#xff0c;经过处理得到5个分数并加权求和得到最终的置信分数 最后对分数向量进行降序排序&#xff0c;得到word rank 代码实现&#xff1a; _, indices torch.sort(score, descendingTrue) 辅助信息 这是AAAI 2020的论…

从0开始深入理解并发、线程与等待通知机制(上)含大厂面试题

目录 一&#xff0c;基础概念 进程与线程 进程&#xff08;就是一代代码的执行程序&#xff0c;程序的实例&#xff09; 线程 大厂面试题&#xff1a;进程间的通信 CPU 核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09; 并行和并发 二&#xff0c;认识…

1.2.C++项目:仿muduo库实现并发服务器之时间轮的设计

文章目录 一、为什么要设计时间轮&#xff1f;&#xff08;一&#xff09;简单的秒级定时任务实现&#xff1a;&#xff08;二&#xff09;Linux提供给我们的定时器&#xff1a;1.原型2.例子 二、时间轮&#xff08;一&#xff09;思想&#xff08;一&#xff09;代码 一、为什…