动态规划篇-03:打家劫舍

198、打家劫舍

状态转移方程

 base case

边界问题就是:走到最后一间房子门口也没抢,那么最终抢到的金额为0

明确状态

“原问题和子问题中会变化的变量”

抢到的金额数就是状态,因为随着在每一件房子门口做选择,抢到的金额数会随之变化

确定选择

“导致状态变化的行为”

在每间房子门口都可以做出两个选择:“抢”或者“不抢”。如果抢了的话那么下一间就不能抢,如果这件不抢的话下一间就可以抢

定义dp函数

根据题意,定义dp(n) 为:n间房子能抢到的最大金额数

此外,还要考虑从第几间房子开始抢。那么dp函数应该有两个参数:从第几间房子开始-start,可抢的房子数组-nums

那么状态转移方程就是:

dp(nums,start) = Math.max(nums[start] + dp(nums,start + 2),dp(nums,start + 1));
//nums[start] + dp(nums,start + 2    表示从第start家开始抢,抢到的金额自然是第start家的金额
//加上从start+2家开始抢得到的金额
//dp(nums,start + 1) 表示第start家不抢了,从下一家开始抢

 我们可以看到,这里再次体现了

“[分解问题]的思路可以扩展成动态规划算法。”

我们把“从第start间房子开始抢到的金额”这个问题分解为:“从下下间房子开始抢” 和 “从下一间房子开始抢”  两个子问题

有了状态转移方程,我们就可以写出最基础的暴力递归解法了

暴力递归

class Solution {public int rob(int[] nums) {return dp(nums,0);}/*dp函数表示从第 start 间房子开始抢的最大金额*/int dp(int[] nums,int start){/*如果这排房子从头到尾都挑完了还没开始抢,那就什么也抢不到*///base caseif(start >= nums.length){return 0;}/*在每个房子门前有两种选择,抢 / 不抢*/int res = Math.max(nums[start] + dp(nums,start+2), dp(nums,start+1));return res;}
}

这种解法显然时间复杂度太高。按照我们之前所讲的:通过处理“重叠子问题”来降低时间复杂度

使用了备忘录的从上到下的递归解法

class Solution {public int rob(int[] nums) {int[] memo = new int[nums.length];//初始化备忘录数组Arrays.fill(memo,-1);return dp(nums,0,memo);}int dp(int[] nums,int start,int[] memo){//base caseif(start >= nums.length){return 0;}//如果备忘录中存有这个数值,就直接取用if(memo[start] != -1){return memo[start];}//状态转移方程memo[start] = Math.max(dp(nums,start+1,memo),nums[start] + dp(nums,start+2,memo));return memo[start];}
}

问题1:如何判断该问题是否能够优化?

根据前面的文章我们已将知道:我们可以通过优化“重叠子问题”来降低时间复杂度。那么我们怎么才能知道是否存在“重叠子问题”呢?

抽象出递归框架,先找出 [状态] ,然后根据递归框架看看:如果从一个状态转移到另一个状态有不止一条路径,那么说明存在 [重叠子问题]

使用了dp数组的从下到上的迭代解法

class Solution {/*从下到上的迭代数组解法*/public int rob(int[] nums) {int n = nums.length;//为什么数组长度定义为 n+2?/*dp[i] 表示从第 i 家开始抢劫获得的金额数,0~n*/int dp[] = new int[n + 2];for (int i = n-1; i >= 0; i--) {dp[i] = Math.max(nums[i] + dp[i+2],dp[i+1]);}return dp[0];}
}

问题1:为什么dp数组长度定义为 n + 2呢?

因为dp[i] 与dp[i+2] 和dp[i+1]有关,为了防止数组越界,将数组长度定为n+2


如果有什么不明白或者文章中内容有误,请在评论区留言。我看到后会一一回复。

及时收获反馈,这对我很重要。

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

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

相关文章

大模型训练营Day3 基于 InternLM 和 LangChain 搭建你的知识库 作业

本篇记录大模型训练营第三次的作业,属实是拖延症本症患者。 主要步骤前面的安装各种包和依赖如前面作业一样,按照文档操作即可: 再按照文档进行各种克隆,把知识库复制到本地: 复制粘贴操作文档中的构建向量数据库的文…

七:Day08_任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求,在 Java 中开发定时任务主要有三种解决方案:一是使用JDK 自带的 Timer,二是使用 Spring Task,三是使用第三方组件 Quartz。 建议: 单体项目架构使用…

基于51单片机的智能热水器设计

需要全部文件请私信关注我!!! 基于51单片机的智能热水器设计 摘要一、绪论1.1 选题背景及意义1.2 完成目标与功能设计 二、硬件系统设计2.1 硬件完成要求2.2 方案选择2.3 电源电路设计2.4 键盘电路2.5 蜂鸣器报警电路2.6 温度检测电路2.7 红…

数学建模.斯皮尔曼相关系数

一、两种定义 二、用matlab计算 三、两种相关系数计算结果的对比 四、取检验值(临界值)分为两种情况 (1)小样本查表 (2)大样本 P值是大于检验值的概率 本文是学习清风网课后的总结,希望对大家有…

1000以内的质数,用python获取放到list1中,1000以内的斐波那契数,用python获取放到list2中,然后两个list画出曲线图

# -*- coding: utf-8 -*- import matplotlib.pyplot as plt # 获取1000以内的质数 def get_primes(n): primes [] for possiblePrime in range(2, n 1): # 假设数是质数 isPrime True for num in range(2, int(possiblePrime ** 0.5) 1): if possiblePrime % num …

数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)

数据结构排序——计数排序和排序总结 现在常见算法排序都已讲解完成,今天就再讲个计数排序。再总结一下 文章目录 1.计数排序2.排序总结3.排序oj(排序数组)题目详情代码思路 1.计数排序 计数排序是一种非基于比较的排序算法,它通…

STL标准库与泛型编程(侯捷)笔记2

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

七:Day07_redis进阶02

第一章 Redis 事务 1.1 节 数据库事务复习 在数据库层面,事务是指一组操作,这些操作要么全都被成功执行,要么全都不执行。 数据库事务的四大特性: A:Atomic, 原子性。要么全部执行,要么全部不…

复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式

随着汽车制造业的快速发展,对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备,以其独特的优势在汽车制造中发挥着越来越重要的作用。因此,富唯智能顺应时代的发展趋势,研发出了ICR系列的复合机器…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -关于我们页面实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

4_【Linux版】重装数据库问题处理记录

1、卸载已安装的oracle数据库。 2、知识点补充: 3、调整/dev/shm/的大小 【linux下修改/dev/shm tmpfs文件系统大小 - saratearing - 博客园 (cnblogs.com)】 mount -o remount,size100g /dev/shm 4、重装oracle后没有orainstRoot.sh 【重装oracle后没有orains…

隧道应用2-netsh端口转发监听Meterpreter

流程介绍: 跳板机 A 和目标靶机 B 是可以互相访问到的,在服务器 A 上可以通过配置 netsh 端口映射访问 B 服务器。如果要拿 B 服务器的权限通常是生成正向后门,使用 kali 的 msf 正向连接B服务器,进而得到 Meterpreter&#xff0c…

大模型微调及生态简单介绍

大模型 大模型生态OpenAI大模型生态: 全球开源大模型性能评估榜单中文语言模型——ChatGLM基于ChatGLM的多模态⼤模型 大模型微调LLM⼤语⾔模型 ⼀般训练过程为什么需要微调高效微调技术⽅法概述⾼效微调⽅法一:LoRA微调方法高效微调⽅法⼆:P…

代码随想录算法训练营第五天天| 总结数组专题

数组:二分查找、双指针(包括快慢指针)、滑动窗口、模拟 链表:双指针、三指针、虚拟头指针、复杂指针操作画图明确每一步(标好次序) 数组 代码随想录总结的很好,如下图。我再结合自己的一些理解…

具于xilinx FPGA的可动态配置DDS频率控制字的DDS IP核使用例程详解

目录 1 概述2 IP examples功能3 IP 使用例程4注意事项5 DDS IP Examples下载位置 1 概述 本文用于讲解xilinx IP 的dds ip examples(动态配置频率)的功能说明,方便使用者快速上手。 2 IP examples功能 本examples 是月隐编写的针对DDS的使…

一篇文章带你了解Redis的发展史

Redis 是一个开源的内存数据存储和处理系统,它在过去的几十年中经历了重大的发展和演进。以下是 Redis 的发展历程概述: 早期阶段(2000年代初至中期):在这个时期,网站的访问量通常较低,单个数据…

51-11 多模态论文串讲—VLMo 论文精读

VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts (NeurIPS 2022) VLMo 是一种多模态 Transformer 模型,从名字可以看得出来它是一种 Mixture-of-Modality-Experts (MoME),即混合多模态专家。怎么理解呢?主流 …

yolov5无人机视频检测与计数系统(创新点和代码)

标题:基于YOLOv5的无人机视频检测与计数系统 摘要: 无人机技术的快速发展和广泛应用给社会带来了巨大的便利,但也带来了一系列的安全隐患。为了实现对无人机的有效管理和监控,本文提出了一种基于YOLOv5的无人机视频检测与计数系…

[软件工具]通用OCR识别文字识别中文识别服务程序可局域网访问

【软件界面】 【算法介绍】 采用业界最先进算法之一paddlocr,PaddleOCR,全称PaddlePaddle OCR,是一种基于深度学习的光学字符识别(OCR)技术。相较于传统的OCR技术,PaddleOCR具有许多优点。 首先&#xff0…

南京观海微电子----时序分析基本概念(一)——建立时间

1. 概念的理解 以上升沿锁存为例,建立时间(Tsu)是指在时钟翻转之前输入的数据D必须保持稳定的时间。如下图所示,一个数据要在上升沿被锁存,那么这个数据就要在时钟上升沿的建立时间内保持稳定。 建立时间是对触发器而…