【数据结构与算法】动态规划法解题20240302

news2024/12/25 13:48:22

在这里插入图片描述


这里写目录标题

  • 一、198. 打家劫舍
    • 1、动态规划五部曲
  • 二、213. 打家劫舍 II

一、198. 打家劫舍

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

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

在这里插入图片描述

1、动态规划五部曲

1、确定dp数组(dp table)以及下标的含义
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。

2、确定递推公式
决定dp[i]的因素就是第i房间偷还是不偷。
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。
如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点)
然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

3、dp数组如何初始化
从递推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);可以看出,递推公式的基础就是dp[0] 和 dp[1]
从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);

# 3、数组初始化
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])

4、确定遍历顺序
dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历!

class S198:
    def func(self, nums):
        # 1、创建dp数组,dp[i]:到达下标为i的位置偷窃的最大金额
        dp = [0] * (len(nums))
        # 3、数组初始化
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        # 4、确定遍历顺序
        for i in range(2, len(nums)):
            # 2、确定递推公式
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
        print(dp)
        return dp[-1]


r = S198()
nums = [2, 7, 9, 3, 1]
print(r.func(nums))

二、213. 打家劫舍 II

中等

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

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

在这里插入图片描述
对于一个数组,成环的话主要有如下三种情况:
情况一:考虑不包含首尾元素
在这里插入图片描述
情况二:考虑包含首元素,不包含尾元素
在这里插入图片描述
情况三:考虑包含尾元素,不包含首元素
在这里插入图片描述
注意我这里用的是"考虑",例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。

而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了。

class S213:
    def func(self, nums):
        if not nums:
            return 0
        if len(nums) <= 2:
            return max(nums)
        # 1、创建dp数组,明确dp数组的含义,之前房间到i时偷的最大金币为dp[i]
        dp = [0] * len(nums)
        # dp[i]:含义 第i个数偷的最高金额
        # todo 抢第一个房间,不抢最后一个房间
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, len(nums) - 1):
            # 2、确定递推公式
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
        res1 = dp[-2]
        print(dp)  # [1, 2, 4, 0]
        dp1 = [0] * len(nums)
        # todo 不抢第一个房间,抢最后一个房间
        dp1[0] = 0
        dp1[1] = nums[1]
        dp1[2] = max(nums[1], nums[2])
        for i in range(3, len(nums)):
            # 2、确定递推公式
            dp1[i] = max(dp1[i - 2] + nums[i], dp1[i - 1])
        res2 = dp1[-1]
        print(dp1)  # [0, 2, 3, 3]
        return max(res1, res2)


r = S213()
nums = [1, 2, 3, 1]
print(r.func(nums))

在这里插入图片描述

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

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

相关文章

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用&#xff0c;在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中&#xff0c; 实例对象的方法主要存储在类的方法列表中&#xff0c;类方法则是主要存储在原类中。 向对象发送消息&#xff0c;核心…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

超链接和导航:网页互动的艺术

引言 在上一篇文章中&#xff0c;我们探索了HTML中多媒体的交互体验&#xff0c;本次我们将学习如何通过超链接和导航栏提升网页的用户体验&#xff0c;让用户在网页访问时更高效&#xff1b; 一、介绍 在这个信息爆炸的时代&#xff0c;如何让用户在第一时间找到他们需要的信…

相机格式化了还能恢复照片吗?内存卡数据恢复方法

相机已成为我们记录生活、工作和学习的重要工具。然而当相机意外格式化后&#xff0c;许多珍贵的照片可能会瞬间消失&#xff0c;这无疑给我们的生活和工作带来不小的困扰。那么相机格式化后&#xff0c;我们是否还有机会找回那些丢失的照片呢&#xff1f; 首先我们需要了解相机…

CSS的弹性布局

CSS 的弹性布局 前言 前端中为了实现页面的布局效果&#xff0c;采用的一个技术手段&#xff0c;它在前端开发的技术场景是非常广泛的 实现上述区域的页面相关的布局效果&#xff0c;就可以使用弹性布局来完成 弹性布局(flex布局) flex 是 flexible box 的缩写&#xff0c;…

ChromeDriver全版本下载教程

确定自己的Chrome版本 step1. 打开Chrome浏览器右上角的三个点&#xff0c;再点击设置 step2. 在设置中点击“关于Chrome”&#xff0c;圈起来的红框即为当前Chrome版本&#xff0c;我的版本就是121.0.6167.185 在json中查找自己对应ChromeDriver版本下载链接 一般教程会让你…

3dmax corona渲染器和vray渲染器哪个好?

Corona和Vray这两个渲染器都很不错&#xff0c;每个都有自己的优点和适用的情况&#xff0c;所以很难说哪个更好。 下面我简单给你对比一下&#xff1a; 1、操作界面&#xff1a;Vray的界面比较多&#xff0c;参数设置也复杂一点&#xff0c;初学者可能会觉得有点难上手。但C…

凌特杯,第二届,数字音频传输。simulink matlab

终于比赛进入了尾声&#xff0c;最为指导老师也是非常的激动。接下来进入了论文写作阶段和视频拍摄阶段。 第二届凌特杯规定的硬件是ADI的Pluto&#xff0c;成本在2k以内&#xff0c;能支持MATLAB&#xff0c;它能够流畅的实时播放接收到的音乐数据&#xff0c;并把数据保存成…

解决Unable to load class ‘org.gradle.api.attributes.VerificationType‘

在使用AdnroidStudio开发过程中难免会遇到Unable to load class org.gradle.api.attributes.VerificationType报错&#xff0c;可以尝试清理缓存重启解决 打开 File-》Invalidate Caches... 重启AndroidStudio后&#xff0c;重新加载即可&#xff0c;但也不是百分百解决。

网络安全学习笔记1

1.了解kali及安装 vmware安装&#xff0c;用户名密码均为kali 2.metasploit是什么 3.metasploit攻击windows系统 在kali中打来终端 数据msfconsole 进入metasploit的控制终端界面 msf的使用法则&#xff1a; 1.使用模块 2.配置模块必选项 3.运行模块 三步操作、实现对…

机器学习高手之路:发现TensorFlow学习网站的无限可能!

介绍&#xff1a;TensorFlow是一个由Google团队开发的端到端开源机器学习平台&#xff0c;专为数值计算和机器学习而设计。以下是对TensorFlow的详细介绍&#xff1a; 开发背景与历史&#xff1a;TensorFlow起源于谷歌的神经网络算法库DistBelief。它被设计成一个灵活的深度学习…

c语言经典测试题9

1.题1 #include <stdio.h> int main() { int i 1; sizeof(i); printf("%d\n", i); return 0; } 上述代码运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;其实这题的难点就是sizeof操作后i的结果是否会改变&#xff0c;首先我们创建了一个整型i&a…

WPF真入门教程31--WPF版房屋租售系统

1、教程回顾 到现在为止&#xff0c;“蒸”入门系列教程已完成了30刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;再提供一个完整有效的综合项目&#xff0c;本项目采…

Blazor系统教程(.net8)

Blazor系统教程 1.认识 Blazor 简单来讲&#xff0c;Blazor旨在使用C#来替代JavaScript的Web应用程序的UI框架。其主要优势有&#xff1a; 使用C#编写代码&#xff0c;这可提高应用开发和维护的效率利用现有的NET库生态系统受益于NET的性能、可靠性和安全性与新式托管平台(如…

企业指标体系建设与管理:运用MECE原则与战略地图,打造完美闭环

在数字化时代&#xff0c;数据已经成为企业的核心资产。为了更好地利用这些数据&#xff0c;企业需要建立一套科学、完整、高效的指标体系。而在这个过程中&#xff0c;MECE原则&#xff08;Mutually Exclusive, Collectively Exhaustive&#xff0c;即“相互独立&#xff0c;完…

JVM 第二部分-2(堆,方法区)

4.堆 堆 一个Java程序&#xff08;main方法&#xff09;对应一个jvm实例&#xff0c;一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建&#xff0c;大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域&#xff0c;是垃圾回收的重点区域堆可以位…

WSL2安装Ubuntu18.04到指定路径(非C盘)

1 系统设置开启WSL 1.1 在搜索框搜索“启动或关闭Windows功能”或在“控制面板”->“程序”->“启用或关闭 windows 功能” 开启 Windows 虚拟化和 Linux 子系统&#xff08;WSL2)以及Hyper-V 按照提示重启计算机&#xff0c;开启WSL。 2 将WSL2 设置为默认版本 wsl --se…

云原生架构技术揭秘:DevOps 技术打破开发运维壁垒,实现持续交付的变革之道

DevOps 是一套将软件开发&#xff08;Development&#xff0c;Dev&#xff09;和系统运维&#xff08;Operations&#xff0c;Ops&#xff09;相结合的实践&#xff0c;旨在缩短应用系统开发生命周期&#xff0c;提供高质量的持续交付。 —— 维基百科 DevOps 0、讲在前面 生…

【Educoder数据挖掘实训】异常值检测-箱线图

【Educoder数据挖掘实训】异常值检测-箱线图 开挖&#xff01; 关于箱线图&#xff0c;核心理念就是找出上四分位数和下四分位数&#xff0c;定义二者的差为 I Q R IQR IQR。上下四分位数分别向上下扩展 1.5 I Q R 1.5IQR 1.5IQR定义为上界和下界&#xff0c;在此之外的数据被…

前端【技术类】资源学习网站整理(那些年的小网站)

学习网站整理 值得分享的视频博主&#xff1a;学习网站链接 百度首页的资源收藏里的截图&#xff08;排列顺序没有任何意义&#xff0c;随性而已~&#xff09;&#xff0c;可根据我标注的关键词百度搜索到这些网站呀&#xff0c;本篇末尾会一一列出来&#xff0c;供大家学习呀 …