每日一练:“打家劫舍“(House Robber)问题 II

news2024/9/23 13:26:03

在这里插入图片描述

  • 有想要了解打家劫舍初级问题的,可以点击下面链接查看!

  每日一练:“打家劫舍“(House Robber)问题 I

1. 问题

  假设有房屋形成一个环形,即第一个房屋和最后一个房屋也相邻,每个房屋里都存放着一定数量的财宝。相邻的房屋装有相互连通的防盗系统,如果两个相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
  求解的问题是,小偷在不触发警报的情况下,一晚上最多能偷到多少财宝。

2. 解题思路(状态转移方程)

2.1 状态转移方程

  状态转移方程是系统动力学中描述系统状态随时间演变的数学方程。这种方程通常用来表示系统的状态如何从一个时间点转移到下一个时间点。在控制理论、物理系统建模、经济学等领域,状态转移方程是非常常见且重要的概念。
  一般而言,状态转移方程可以用如下的形式表示:
在这里插入图片描述
  ·x(t)是系统在时间t的状态向量。
  ·u(t)是在时间t的输入向量。
  ·A是状态转移矩阵,描述系统状态如何随时间演变。
  ·B是输入矩阵,描述输入如何影响状态的演变。
  这个方程表示系统在下一个时间点的状态x(t+1)是当前状态x(t)通过矩阵A的变换加上输入u(t)通过矩阵B的变换得到的。
  在一些应用中,状态转移方程也可能包含时间的影响、随机扰动等因素,具体形式可能会更加复杂。

2.2 解题思路

  为了应用状态转移方程解决这个问题,可以将问题抽象成一个动态规划问题,其中状态表示小偷在每个房屋处的状态。假设有n个房屋,用f()表示小偷在第个房屋时能够获得的最大财物价值。状态转移方程可以表示为:
在这里插入图片描述
  f(i)是在第个房屋时能够获得的最大财物价值价值[i是第我个房屋中的财物价值。
  f(i-1)表示小偷选择不盗窃当前房屋,所以能够获得的最大财物价值与前一个房屋的最大财物价值相同。
  F(i-2)+value[i]表示小偷选择盗窃当前房屋,所以能够获得的最大财物价值为前两个房屋的最大财物价值加上当前房屋的财物价值。

  这个状态转移方程反映了一个典型的动态规划问题,通过递推求解,可以找到小偷在整个房屋序列中能够获得的最大财物价值。这个问题的动态规划解法避免了重复计算,提高了效率

3. 代码设计思路

  当处理环形房屋的打家劫舍问题时,我们可以利用动态规划的思想,定义一个动态规划数组 dp,其中 dp[i] 表示前 i 个房屋中小偷能够偷到的最大财宝数量。然后可以利用状态转移方程来更新dp 数组。

  在这个问题中,有两种情况需要考虑:
  1)小偷偷第一个房屋,不偷最后一个房屋:这意味着小偷只能在第二个房屋到最后一个房屋中选择偷窃。这个时候状态转移方程为:
  在这里插入图片描述

  2)小偷不偷第一个房屋,偷最后一个房屋:这意味着小偷只能在第一个房屋到倒数第二个房屋中选择偷窃。这个时候状态转移方程为:
  在这里插入图片描述

3. 代码实现

def rob(nums):
    # 如果输入为空列表,则返回0,表示没有房屋可以抢劫
    if not nums:
        return 0

    # 定义rob_range函数,用于计算在指定范围内的房屋中能够抢到的最大金额
    def rob_range(start, end):
        prev, curr = 0, 0
        # 遍历指定范围内的房屋
        for i in range(start, end + 1):
            # 记录当前位置的最大值,即当前位置的最大金额
            temp = curr
            # 更新当前位置的最大值,考虑是否抢劫当前房屋
            curr = max(prev + nums[i], curr)
            # 更新前一个位置的最大值,为下一次迭代做准备
            prev = temp
        # 返回指定范围内的最大金额
        return curr

    # 返回不抢劫第一间房和不抢劫最后一间房的两种情况的最大值
    return max(rob_range(0, len(nums) - 2), rob_range(1, len(nums) - 1))

# 示例
nums = [2, 3, 2, 5, 7]
result = rob(nums)
print(result)

  1)rob函数是主函数,接受一个代表每个房屋可抢劫金额的列表nums
  2)在函数开头,检查nums是否为空,如果为空则返回0,因为没有房屋可以抢劫。
  3)rob_range函数是用于计算在指定范围内的房屋中能够抢到的最大金额的辅助函数。
  4)在rob_range函数中,使用动态规划的思想,遍历指定范围内的房屋,计算在每个位置能够抢到的最大金额。
  5)主函数中调用两次rob_range函数,分别表示不抢劫第一间房和不抢劫最后一间房的两种情况。
  最终返回两种情况的最大值,即能够在不触发警报的情况下抢到的最大金额。

4. 动态规划算法

  通常用于求解具有某种最优性质的问题。
  在这类问题中,可能会有许多可行解。每一个解都对应于一个值,希望找到具有最优值的解。
  动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。
  如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。
  可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

5. 动态规划术语

  阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。在多数情况下,阶段变量是离散的,用k表示。此外,也有阶段变量是连续的情形。如果过程可以在任何时刻作出决策,且在任意两个不同的时刻之间允许有无穷多个决策时,阶段变量就是连续的 。

  状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点。

  无后效性:我们要求状态具有下面的性质:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响,所有各阶段都确定时,整个过程也就确定了。换句话说,过程的每一次实现可以用一个状态序列表示,在前面的例子中每阶段的状态是该线路的始点,确定了这些点的序列,整个线路也就完全确定。从某一阶段以后的线路开始,当这段的始点给定时,不受以前线路(所通过的点)的影响。状态的这个性质意味着过程的历史只能通过当前的状态去影响它的未来的发展,这个性质称为无后效性。

  决策:一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择(行动)称为决策。在最优控制中,也称为控制。在许多问题中,决策可以自然而然地表示为一个数或一组数。不同的决策对应着不同的数值。描述决策的变量称决策变量,因状态满足无后效性,故在每个阶段选择决策时只需考虑当前的状态而无须考虑过程的历史 [6] 。
决策变量的范围称为允许决策集合 。

  策略:由每个阶段的决策组成的序列称为策略。对于每一个实际的多阶段决策过程,可供选取的策略有一定的范围限制,这个范围称为允许策略集合 。
  允许策略集合中达到最优效果的策略称为最优策略。
  给定k阶段状态变量x(k)的值后,如果这一阶段的决策变量一经确定,第k+1阶段的状态变量x(k+1)也就完全确定,即x(k+1)的值随x(k)和第k阶段的决策u(k)的值变化而变化,那么可以把这一关系看成(x(k)u(k))x(k+1)确定的对应关系,用x(k+1)=Tk(x(k),u(k))表示。这是从k阶段到k+1阶段的状态转移规律,称为状态转移方程 。

  最优化原理:作为整个过程的最优策略,它满足:相对前面决策所形成的状态而言,余下的子策略必然构成“最优子策略”。
  最优性原理实际上是要求问题的最优策略的子策略也是最优。
在这里插入图片描述

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

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

相关文章

Java数组的复制、截取(内含例题:力扣-189.轮转数组)

目录 数组的复制、截取: 1、使用Arrays中的copyOf方法完成数组的拷贝 2、使用Arrays中的copyofRange方法完成数组的拷贝 题目链接: 数组的复制、截取: 1、使用Arrays中的copyOf方法完成数组的拷贝 public class Csdn {public static vo…

【Git】一文教你学会 submodule 的增、查、改、删

添加子模块 $ git submodule add <url> <path>url 为想要添加的子模块路径path 为子模块存放的本地路径 示例&#xff0c;添加 r-tinymaix 为子模块到主仓库 ./sdk/packages/online-packages/r-tinymaix 路径下&#xff0c;命令如下所示&#xff1a; $ git subm…

UI自动化测试神器:RunnerGo测试平台

可以直接进入官网下载开源版或点击右上角体验企业版体验 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度…

可持续创新 精选路线

在加速企业数字化转型、 实现智能制造的升级之路上&#xff01; 使用好的工具固然重要&#xff0c; 而有好工具&#xff0c;也要会用工具。生信科技不仅为企业提供强大的产品支持&#xff0c; 更有全方位的定制化服务&#xff0c; 提升工程师的工具应用能力&#xff0c; 让企业…

海外https代理ip如何保障信息安全?该怎么选择?

海外https代理ip是指通信协议为https的海外真实网络地址ip&#xff0c;通常应用在各种跨境业务中。 一、什么是HTTPS协议 HTTP协议是一个应用层协议&#xff0c;通常运行在TCP协议之上。它是一个明文协议&#xff0c;客户端发起请求&#xff0c;服务端给出响应的响应。由于网…

pat实现基于邻接表表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(ALGraph G, int v) {visited[v] 1;printf("%c ", G.vertices[v].data);for (ArcNode* cur G.vertices[v].firstarc; cur ! nullptr; cur cur->nextarc){if (!visited[cur->adjvex])DFS(G, cur->adjvex);} }2.非…

matlab画双坐标图的样式

matlab画双坐标图的样式 %% clc,clear,close all; t0:0.1:9*pi; figure; [AX,Ha,Hb]plotyy(t,sin(t),t,exp(t)); % 绘图并创建句柄 % ----------------- 设置刻度 set(AX(1),yTick,[-1.250:0.25:1.25]) % 设置左边Y轴的刻度 set(AX(2),yTick,[0:50:350]) …

2023年【危险化学品经营单位安全管理人员】考试内容及危险化学品经营单位安全管理人员最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试内容是安全生产模拟考试一点通生成的&#xff0c;危险化学品经营单位安全管理人员证模拟考试题库是根据危险化学品经营单位安全管理人员最新版教材汇编出危险化学品经营单位安全管…

HarmonyOS开发:ArkTs常见数据类型

前言 无论是Android还是iOS开发&#xff0c;都提供了多种数据类型用于常见的业务开发&#xff0c;但在ArkTs中&#xff0c;数据类型就大有不同&#xff0c;比如int&#xff0c;float&#xff0c;double&#xff0c;long统一就是number类型&#xff0c;当然了也不存在char类型&…

新式的拉式膜片弹簧离合器设计机械设计CAD

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;离合器 获取完整论文报告工程源文件 减震弹簧 摩擦片 膜片弹簧 压盘 轴 扭转减震器 从动盘 离合器 离合器的结构设计 为了达到计划书所给的数据要求&#xff0c;设计时应根据车型的类别、使用要求、制造条件&#xff0c;…

Flink-简介与基础

Flink-简介与基础 一、Flink起源二、Flink数据处理模式1.批处理2.流处理3.Flink流批一体处理 三、Flink架构1.Flink集群2.Flink Program3.JobManager4.TaskManager 四、Flink应用程序五、Flink高级特性1.时间流&#xff08;Time&#xff09;和窗口&#xff08;Window&#xff0…

FreeRTOS深入教程(信号量源码分析)

文章目录 前言一.创建信号量二.释放信号量三.获取信号量成功获取获取不成功 总结 前言 本篇文章将为大家讲解信号量&#xff0c;源码分析。 在 FreeRTOS 中&#xff0c;信号量的实现基于队列。这种设计的思想是利用队列的特性来实现信号量&#xff0c;因为信号量可以被视为只…

借助 XEOS V6, 农牧龙头企业实现原有存储的高效在线替换

面对旧有存储系统的应用不足&#xff0c;某大型现代农牧龙头企业采用了星辰天合的对象存储 XEOS V6 方案&#xff0c; 该方案以其卓越的技术架构和同城双活异地灾备的解决方案完整性&#xff0c;在无缝高效完成系统替换的同时&#xff0c;可以极大地提升系统的灵活性和业务的连…

C/C++ 实现Socket交互式服务端

在 Windows 操作系统中&#xff0c;原生提供了强大的网络编程支持&#xff0c;允许开发者使用 Socket API 进行网络通信&#xff0c;通过 Socket API&#xff0c;开发者可以创建、连接、发送和接收数据&#xff0c;实现网络通信。本文将深入探讨如何通过调用原生网络 API 实现同…

RabbitMQ之发送者(生产者)可靠性

文章目录 前言一、生产者重试机制二、生产者确认机制实现生产者确认&#xff08;1&#xff09;定义ReturnCallback&#xff08;2&#xff09;定义ConfirmCallback 总结 前言 生产者重试机制、生产者确认机制。 一、生产者重试机制 问题&#xff1a;生产者发送消息时&#xff0…

【python VS vba】(6) python的常用函数print()的各种用法和细节(未完成)

1 基本语法 print() 3.0 都是函数用法 2 可打印的各种对象 直接打印对象 直接打印数组 直接打印string 数值等 3 打印的各种内容如何连接 逗号分隔 &不行 3 转义符 可用转义符 换行的特殊符号 /n 4 print() 里带变量怎么输出 试验了4种输出带变量的方法&#xf…

无需外接显示器,直接使用windows安装树莓派系统并可远程桌面登录

准备工作: 1.安装树莓派官方烧录工具 raspberry pi imager 2.下载树莓派系统镜像(也可选择在线下载安装) 打开imager工具&#xff0c;选择需要安装包树莓派版本 点击"NEXT"&#xff0c;在弹出的选项中选择编辑设置。 设置登录名和密码&#xff0c;已经所连接的wif…

如何有效减少 AI 模型的数据中心能源消耗?

在让人工智能变得更好的竞赛中&#xff0c;麻省理工学院&#xff08;MIT&#xff09;林肯实验室正在开发降低功耗、高效训练和透明能源使用的方法。 在 Google 上搜索航班时&#xff0c;您可能已经注意到&#xff0c;现在每个航班的碳排放量估算值都显示在其成本旁边。这是一种…

在Linux服务器部署爬虫程序?大佬只需七步!

之前在某乎上看见一篇关于《为什么很多程序员都建议使用 Linux》的文章&#xff0c;结合我自身关于Linux的使用经验。心血来潮得写了一段关于我在Linux系统部署爬虫程序的心得&#xff0c;希望结识更多的爬虫技术大佬&#xff0c;一起游弋在代码世界中。 根据我多年在Linux上部…

机器学习-激活函数的直观理解

机器学习-激活函数的直观理解 在机器学习中&#xff0c;激活函数&#xff08;Activation Function&#xff09;是用于引入非线性特性的一种函数&#xff0c;它在神经网络的每个神经元上被应用。 如果不使用任何的激活函数&#xff0c;那么神经元的响应就是wxb&#xff0c;相当…