Rust面试宝典第4题:打家劫舍

news2024/11/24 7:15:19

题目

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

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

        示例 1:

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

        示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃1号房屋 (金额 = 2), 偷窃3号房屋 (金额 = 9),接着偷窃5号房屋 (金额 = 1),
偷窃到的最高金额为2 + 9 + 1 = 12。

解析

        这道题主要考察应聘者对动态规划算法的理解和应用能力,在面试中比较常见。

        首先,我们要明确问题的限制条件和目标。在这个问题中,小偷不能偷相邻的房屋,因为相邻的房屋装有连通的防盗系统,如果两间相邻的房屋在同一晚上被闯入,系统会自动报警。我们的目标是找出小偷在不触发警报的情况下,一夜之内能够偷到的最高金额。

        由于小偷不能偷相邻的房屋,这意味着在偷窃过程中,我们需要做出选择:偷这家还是那家。这种类型的问题非常适合用动态规划(DP)来解决,因为DP能够很好地处理这种需要做出一系列决策以优化最终结果的问题。

        在动态规划中,我们需要定义一个状态来表示问题的子问题。在这个问题中,我们可以定义一个DP数组dp,其中dp[i]表示偷到第i家时能够获得的最高金额。注意,这里的“偷到第i家”,并不意味着一定要偷第i家,而是考虑到第i家时的情况。

        接下来,我们需要找出状态之间的转移关系。对于第i家,小偷有两种选择:

        1、偷第i家:如果小偷选择偷第i家,那么他就不能偷第i-1家。因此,偷到第i家时的最高金额就是偷到第i-2家的最高金额加上第i家的金额,即dp[i] = dp[i-2] + nums[i]。

        2、不偷第i家:如果小偷选择不偷第i家,那么偷到第i家的最高金额就是偷到第i-1家的最高金额,即dp[i] = dp[i-1]。

        由于小偷想要最大化偷窃的金额,故他会选择这两种情况中的较大值。因此,状态转移方程为:

          dp[i] = max(dp[i-1], dp[i-2] + nums[i])

          对于动态规划问题,我们还需要考虑边界条件。在这个问题中,有两个明显的边界条件:

          当只有一家时(n = 1),小偷只能偷这一家,所以dp[0] = nums[0]。

          当有两家时(n = 2),小偷会选择金额较大的那一家偷,所以dp[1] = max(nums[0], nums[1])。

        最后,当所有的dp[i]都计算出来后,dp[n-1]就是小偷能够偷到的最高金额,其中n是房屋的数量。具体的实现,可参考下面的示例代码。

pub fn rob(nums: Vec<i32>) -> i32 {
    let n = nums.len();
    if n == 0 {
        return 0;
    } else if n == 1 {
        return nums[0];
    }

    let mut dp = vec![0; n];
    dp[0] = nums[0];
    dp[1] = std::cmp::max(nums[0], nums[1]);
    for i in 2..n {
        dp[i] = std::cmp::max(dp[i - 1], dp[i - 2] + nums[i]);
    }

    dp[n - 1]
}

fn main() {
    let mut max_amount = rob(vec![1, 2, 3, 1]);
    println!("{}", max_amount);

    max_amount = rob(vec![2, 7, 9, 3, 1]);
    println!("{}", max_amount);
}

总结

        本题考察了动态规划的应用,需要合理地定义状态,找出状态转移方程,并正确处理边界条件。通过这道题,可以加深我们对动态规划算法的理解和运用。

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

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

相关文章

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架&#xff08;ArkUI&#xff09;、分布式组网和 FA 跨设备迁移能力等新特性&#xff0c;因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后&#xff0c;用户须根据提示完成相应操作&am…

回归预测 | Matlab实现GWO-GPR灰狼算法优化高斯过程回归多变量回归预测

回归预测 | Matlab实现GWO-GPR灰狼算法优化高斯过程回归多变量回归预测 目录 回归预测 | Matlab实现GWO-GPR灰狼算法优化高斯过程回归多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现GWO-GPR灰狼算法优化高斯过程回归多变量回归预测 1.Matlab实现…

上海计算机学会 2023年10月月赛 乙组T3 树的连通子图(树、树形dp)

第三题&#xff1a;T3树的连通子图 标签&#xff1a;树、树形 d p dp dp题意&#xff1a;给定一棵 n n n个结点的树&#xff0c; 1 1 1号点为这棵树的根。计算这棵树连通子图的个数&#xff0c;答案对 1 , 000 , 000 , 007 1,000,000,007 1,000,000,007取余数。题解&#xff1…

笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2

对应于其强大的能力&#xff0c;大语言模型 (LLM) 需要强大的算力支撑&#xff0c;而个人计算机上很难满足这一需求。因此&#xff0c;我们别无选择&#xff0c;只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…

Java之二维数组

使用二维数组&#xff1a; 引用二维数组元素需要指明行下标和列下标。二维数组有两个指标&#xff0c;行数使用“数组名.length",每行的列数使用“数组名[i].length”。遍历是二维数组的基本算法&#xff0c;使用双重循环遍历二维数组。外层循环控制行&#xff0c;内存循环…

Kubernetes对象的定义和操作

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

HTML内联框架

前言&#xff1a; 我们有时候打开网页时会有广告窗的出现&#xff0c;而这些窗口并不是来自于本站的&#xff0c;而是来自于外部网页&#xff0c;只是被引用到了自己网页中而已。这一种技术可以通过内联来实现。 标签介绍&#xff1a; HTML 内联框架元素 (<iframe>) 表示…

DNS服务器配置与管理(3)——综合案例

DNS服务器配置与管理 前言 在之前&#xff0c;曾详细介绍了DNS服务器原理和使用BIND部署DNS服务器&#xff0c;本文主要以一个案例为驱动&#xff0c;在网络中部署主DNS服务器、辅助DNS服务器以及子域委派的配置。 案例需求 某公司申请了域名example.com&#xff0c;公司服…

linux C -- 消息队列

linux C -- 消息队列 前言一、System V(IPC)消息队列接口调用主要涉及到 msgget、msgsnd、msgrcv 和 msgctl 四个接口&#xff1a; 1、创建消息队列 msgget2、发送消息到队列3、从队列接收信息4、控制消息队列 msgctl5、删除消息队列 二、代码编写1、发送部分的代码2、代码完成…

牛客-环形链表的约瑟夫问题

目录 题目 描述 示例1 示例2 图解 代码(解析在注释中) 题目 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号…

大数据平台搭建2024(一)

一&#xff1a;基础配置 创建虚拟机并查出ip地址进行连接 ip a1.配置node01静态ip地址与主机名 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改或添加如下内容&#xff1a; BOOTPROTO"static" ONBOOTyes #根据虚拟机网卡信息配置 IPADDR192.168.200.141 NET…

SQL-Post注入

Post注入 在登录过程中&#xff0c;输入用户名和密码&#xff0c;用户名和密码以表单的形式提交&#xff0c; 提交到服务器后服务器再进行验证。这就是一次post的过程的。 在输入正确的用户名和密码后显示 尝试会不会回显报错信息&#xff0c;输入admin--,回显报错了。 尝试…

一个文生视频MoneyPrinterTurbo项目解析

最近抖音剪映发布了图文生成视频功能,同时百家号也有这个功能,这个可以看做是一个开源的实现,一起看看它的原理吧~ 一句话提示词 大模型生成文案 百家号生成视频效果 MoneyPrinterTurbo生成视频效果 天空为什么是蓝色的? 天空之所以呈现蓝色,是因为大气中的分子和小粒子会…

Cisco ACI使用Postman配置交换机-未完待续

先看下不使用脚本的情况下是怎么配置交换机端口的&#xff1f; 例&#xff1a; 有10个交换机接口要开trunk&#xff0c;透传50个vlan&#xff0c; 使用GUI的操作方式为 1 进入EPG -->Static port 2 右键&#xff0c;绑定接口 3 选中node -->指定接口—>指定vlan —>…

Python赋能AI数据分析开启人工智能新时代

文章目录 一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一《编程菜鸟学Python数据分析》编辑推荐内容简介作者简介目录前言为什么要写这本书读者对象如何阅读本书 随着我国企业数字化和信…

每日一题(PTAL2-006):树的遍历--树的构建,队列

因为要层序遍历&#xff0c;所以我们可以考虑构建一颗二叉树。构建完只有利用队列就可以就行层序遍历。 #include <bits/stdc.h> using namespace std; int p1[35]; int p2[35]; typedef struct Tree {int val;struct Tree* left;struct Tree* right; }TT; typedef TT* …

基于逐笔数据合成高频订单簿:DolphinDB 订单簿引擎

订单簿是交易市场上买卖双方正在报价的不同价格的列表。订单簿快照反应了特定时刻市场上的交易意图&#xff0c;比如交易活跃的证券标的往往有着密集的订单簿。订单簿快照对量化金融的交易策略、风险管理和市场分析等方面都具有重要意义。 通常交易所可以提供实时和历史的行情…

【ROS2笔记六】ROS2中自定义接口

6.ROS2中自定义接口 文章目录 6.ROS2中自定义接口6.1接口常用的CLI6.2标准的接口形式6.3接口的数据类型6.4自定义接口Reference 在ROS2中接口interface是一种定义消息、服务或动作的规范&#xff0c;用于描述数据结构、字段和数据类型。ROS2中的接口可以分为以下的几种消息类型…

鸿蒙南向开发:【编译和烧录】指导

编译 #进入源码目录 #rm -rf ohos_config.json #hb set #. #如下图所示,按↑↓键&#xff0c;选择需要编译的工程名&#xff0c;然后回车 #hb build -f #然后回车&#xff0c;等待屏幕出现&#xff1a;BUILD SUCCESS字样&#xff0c;说明编译成功。如下图 #编译生成的固件在…

WPS的JS宏如何实现全文件路径字符串中截取文件名(excel)

从全文件路径的字符串中&#xff0c;截取文件名称&#xff0c;例如&#xff1a; 全文件路径字符串为&#xff1a;C:\Windows\System32\drivers\acpi1.sys 需要截取文件名&#xff1a;acpi1.sys 方法如下&#xff1a; 1、简单的方式&#xff1a;把全文件路径字符串拷贝&…