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

【附源码】Python :打家劫舍

系列文章目录

Python 算法学习:打家劫舍问题


文章目录

  • 系列文章目录
  • 一、算法需求
  • 二、解题思路
  • 三、具体方法+源码
    • 方法1:动态规划(自底向上)
    • 方法2:动态规划(自顶向下)
    • 方法3:优化的动态规划
    • 方法4:递归
  • 总结


一、算法需求

“打家劫舍”问题是一个经典的动态规划问题,通常用来描述一个小偷在一条街上偷窃房屋的场景。每间房屋都有一定数量的现金,小偷需要决定偷哪些房屋以最大化他的收益。但是,小偷面临一个限制:如果两间相邻的房屋在同一晚上被偷,那么防盗系统会触发报警。因此,小偷不能偷窃相邻的房屋。


二、解题思路

动态规划: 定义一个数组 dp,其中 dp[i] 表示到第 i 间房屋为止能偷到的最大金额。状态转移方程是 dp[i] = max(dp[i-1], dp[i-2] + nums[i]),表示可以选择偷当前房子(前提是不偷前一个房子)或者不偷当前房子(延续前一个房子的决策)。

贪心算法: 虽然不总是最优,但可以作为一种尝试。在每一步选择当前能获得的最大金额,而不考虑未来的房子。

递归: 通过递归函数模拟决策过程,考虑偷或不偷当前房子,并取两种选择中的最大值。

优化空间: 使用两个变量代替数组,减少空间复杂度。


三、具体方法+源码

方法1:动态规划(自底向上)

状态定义:dp[i] 表示到第 i 个房子为止能偷到的最大金额。

计算过程:

dp[0] = 2(只考虑第一个房子)
dp[1] = max(2, 7) = 7(考虑第一个和第二个房子)
dp[2] = max(7, 2+9) = 9(考虑第二个和第三个房子)
dp[3] = max(9, 7+3) = 10(考虑第三个和第四个房子)
dp[4] = max(10, 9+1) = 12(考虑第四个和第五个房子)
结果:12

代码如下:

def rob1(nums):if not nums:return 0if len(nums) == 1:return nums[0]dp = [0] * len(nums)dp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, len(nums)):dp[i] = max(dp[i-1], dp[i-2] + nums[i])return dp[-1]# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob1(nums))

方法2:动态规划(自顶向下)

计算过程:

从 rob(0) 开始
rob(1) = max(rob(2), rob(3)) = max(7, 9) = 9
rob(2) = max(rob(3), rob(4) + 2) = max(9, 10) = 10
rob(3) = max(rob(4), rob(5) + 3) = max(9, 12) = 12
rob(4) = max(rob(5), rob(6) + 1) = max(7, 12) = 12
结果:12

代码如下:

def rob2(nums):memo = {}def rob(i):if i >= len(nums):return 0if i in memo:return memo[i]memo[i] = max(rob(i+1), nums[i] + rob(i+2))return memo[i]return rob(0)# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob2(nums))

方法3:优化的动态规划

计算过程:

prev = 2, curr = 7
prev = 7, curr = 9
prev = 9, curr = 10
prev = 10, curr = 12
结果:12

代码如下:

def rob3(nums):if not nums:return 0if len(nums) == 1:return nums[0]prev, curr = 0, 0for num in nums:prev, curr = curr, max(prev + num, curr)return curr# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob3(nums))

方法4:递归

计算过程:

helper(0) = max(helper(1), helper(2) + 2) = max(7, 9) = 9
helper(1) = max(helper(2), helper(3) + 7) = max(9, 10) = 10
helper(2) = max(helper(3), helper(4) + 9) = max(10, 12) = 12
helper(3) = max(helper(4), helper(5) + 3) = max(9, 12) = 12
helper(4) = max(helper(5), 1) = 12
结果:12

代码如下:

def rob4(nums):def helper(i):if i == len(nums):return 0if i == len(nums) - 1:return nums[i]return max(helper(i+1), nums[i] + helper(i+2))return helper(0)# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob4(nums))

总结

这个问题在算法学习中非常重要,因为它展示了如何使用动态规划解决具有重叠子问题和最优子结构特性的问题。它也常用于面试中,考察候选人对动态规划的理解和应用能力。

这个问题的变种也很多,比如考虑环形街道的情况,或者房屋之间的防盗系统有不同的触发条件等。

相关文章:

【附源码】Python :打家劫舍

系列文章目录 Python 算法学习:打家劫舍问题 文章目录 系列文章目录一、算法需求二、解题思路三、具体方法源码方法1:动态规划(自底向上)方法2:动态规划(自顶向下)方法3:优化的动态…...

YOLO11改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文介绍了一种新颖的动态稀疏注意力机制…...

高级Python开发工程师的面试备考指南

目录 博客标题:高级Python开发工程师的面试备考指南:30个面试问题与详细解析岗位职责问题解析1. 公司产品功能开发和代码维护2. 技术方案与项目计划制定3. 算法基础与代码优化4. 项目管理与团队协作任职要求问题解析5. Python 开发经验6. 数据处理相关库(Pandas, Numpy, Mat…...

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景&…...

23-云原生监控系统

├──23-云原生监控系统 | ├──1-Prometheus监控 | | ├──1-二进制方式部署Prometheus监控系统 | | ├──2-二进制方式部署Prometheus监控系统告警 | | ├──3-容器化构建Prometheus监控系统 | | ├──4-容器监控方案CAdvisor | | └──5-k8s监…...

信息安全工程师(40)防火墙技术应用

一、防火墙的基本概念 防火墙是一种网络安全设备,用于监控和控制网络流量,以保护网络免受未经授权的访问和攻击。它可以是装配多张网卡的通用计算机,也可能是通用的物理设备。防火墙通过在网络之间设置访问控制策略,对进出的通信流…...

Liquid AI与液态神经网络:超越Transformer的大模型架构探索

1. 引言 自2017年谷歌发表了开创性的论文《Attention Is All You Need》以来,基于Transformer架构的模型迅速成为深度学习领域的主流选择。然而,随着技术的发展,挑战Transformer主导地位的呼声也逐渐高涨。最近,由麻省理工学院(M…...

Spring Boot 进阶-详解Spring Boot中使用Swagger3.0

在上篇文章中我们介绍了Spring Boot 整合Swagger3.0的一些基础用法,这篇文章中我们来深入学习一下Swagger3.0 还有其他高级用法。 在日常的开发中,为了减少工作量,我们会遇到一种情况,就是将前端的接口与后端的接口编写到同一个代码中,这样也提高了代码的复用率,减少了重…...

Linux平台Kafka高可用集群部署全攻略

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Kafka简介 2、Kafka核心优势 二、环境准备 1…...

Android中有哪些布局方式?

Android中的布局方式是实现用户界面设计的基础,通过合理的布局,可以创建出美观且易用的应用程序界面。Android提供了多种布局方式,每种布局方式都有其特定的应用场景和特点。以下是对Android中主要布局方式的详细介绍: 一、线性布…...

Apache Ranger 70道面试题及参考答案

什么是Apache Ranger? Apache Ranger Apache Ranger 是一个用于 Hadoop 生态系统的集中式安全管理框架,旨在为 Hadoop 及相关大数据技术提供全面的安全解决方案。 它具有以下主要特点和功能: 一、访问控制管理 细粒度的权限控制:可以对 Hadoop 生态系统中的各种组件(如 H…...

2024年9月30日--10月6日(ue5肉鸽结束,20小时,共2851小时)

按照月计划,本周把ue肉鸽游戏完成,然后进行ue5太阳系 , 剩余14节,218分钟,如果按照10分钟的视频教程1小时进行完的话,则需要22小时,分布在10月2日-10月6日之间,每天44分钟的视频教程…...

什么是静态加载-前端

什么是前端静态加载 在前端开发中,静态加载是一种常见且重要的技术。简单来说,前端静态加载指的是在页面加载时将所需的资源(如HTML、CSS、JavaScript、图片等)一并加载到用户的浏览器中。这种方式有助于提高页面的加载速度和用户…...

(01)python-opencv基础知识入门(图片的读取与视频打开)

前言 一、图像入门 1.1 读取图像cv.imread() 1.2 数组数据转换cv.cvtColor() 1.3数据窗口展示 1.4图像保存 1.5图像的截取 1.6 图像的比例缩放 二、视频入门 参考文献 前言 OpenCV 于 1999 年由 Gary Bradsky 在英特尔创立,第一个版本于 2000 年问世。Vad…...

quic-go实现屏幕广播程序

最近在折腾quic-go, 突然想起屏广适合用udp实现,而http3基于quic-go,后者又基于udp, 所以玩一下。 先贴出本机运行效果图: 功能(实现)说明: 1.服务器先启动作为共享屏幕方,等待客户端连接上来 2.客户端连接 3.客户…...

C#操作SqlServer数据库语句

操作数据库语句 操作数据库语句需要搭配数据库的连接Connection类 和下达SQL命令Command类 1. ExecuteNonQuery ExecuteNonQuery 方法主要用来更新数据。通常使用它来执行Update、Insert和Delete语句,最后执行sql语句的时候可以用一个整形变量来接收,返…...

Linux之实战命令33:mount应用实例(六十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

论文精读:基于概率教师学习的跨域自适应目标检测(ICML2022)

原文标题:Learning Domain Adaptive Object Detection with Probabilistic Teacher 中文标题:基于概率教师学习的域自适应目标检测 代码地址: GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 p…...

thinkphp 学习记录

1、PHP配置 (点开链接后,往下拉,找到PHP8.2.2版本,下载的是ZIP格式,解压即用) PHP For Windows: Binaries and sources Releases (这里是下载地址) 我解压的地址是:D:\…...

Leetcode 24 Swap Nodes in Pairs

题意:给定一个list of nodes,要求交换相邻的两个节点 https://leetcode.com/problems/swap-nodes-in-pairs/description/ Input: head [1,2,3,4] Output: [2,1,4,3] 首先你需要思考,我要交换两个节点,对于每个节点,向…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...