[Mdp] lc198. 打家劫舍(记忆化搜索+dp)

news2025/1/9 2:10:18

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:198. 打家劫舍

前置:

  • [每日一题] 146. 打家劫舍(数组、动态规划、巧妙解法)

2. 题目解析

记忆化搜索可以处理,是自顶向下进行枚举的,属于 递归。
动态规划,属于 递推。

思路:dfs 记忆化搜索

  • dfs 搜索前 i 个房子所能获取的最大金额。
  • 对于 i 来说,有两种情况,选 或者 不选。
  • 选了 i,那么意味着状态是由 dfs(i-2) 转移过来的。
  • 不选 i 那么意味着状态是由 dfs(i-1) 转移过来的。
  • 也就是说,每一个位置都需要考虑 选、不选 的问题。
  • 此时时间复杂度即为 2 n 2^n 2n
  • 其实能发现,有很多重复计算的状态,所以可以将其计算的结果进行记忆化,然后再次进入该状态时,直接返回结果即可。
  • 借用一下灵神的图:
  • 在这里插入图片描述
    在这里插入图片描述
  • 此时时间复杂度就变成了 O ( n ) O(n) O(n)。因为有 n 个状态,但每个状态只会被计算一次。

思路:dp

  • 很简单的 dp 哈。
  • dp[i] 表示前 i 个房屋的最大金额。
  • 状态转移:dp[i]=max(dp[i-1], dp[i-2]+nums[i]);
  • 注意这里有 i-1、i-2,需要初始化 dp[0]、dp[1] 这两个状态 即可。
  • 额外注意 nums 值为 1 的情况,此时没有办法做 i-2 的转移,直接返回结果即可。

综上,比对两者做法:

  • 记忆化搜索:通过结果过去解决问题。
  • dp:通过 递推的方式解决问题。

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( n ) O(n) O(n)

代码:

记忆化搜索:

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> memo(n, -1); // -1 表示没有计算过
        // dfs(i) 表示从 nums[0] 到 nums[i] 最多能偷多少
        auto dfs = [&](auto&& dfs, int i) -> int {
            if (i < 0) return 0; // 递归边界(没有房子)
            if (memo[i] != -1) return memo[i]; // 之前计算过
            return memo[i] = max(dfs(dfs, i - 1), dfs(dfs, i - 2) + nums[i]);
        };
        return dfs(dfs, n - 1); // 从最后一个房子开始思考
    }
};

dp

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];
        
        vector<int> f(n);
        f[0] = nums[0];
        f[1] = max(nums[0], nums[1]);
        for (int i = 2; i < n; i ++ ) f[i] = max(f[i - 1], f[i - 2] + nums[i]);
        return f[n - 1];
    }
};

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

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

相关文章

Nuxt3服务端渲染项目简单搭建

目录 1.准备阶段 2.创建项目 3.安装需要的模块 1&#xff09;安装ArcoDesign/ElementPlus 2&#xff09;安装tailwindcss 4.目录结构 5.网站TDK设置 本篇文章相关的官方网站&#xff1a; 1.nuxt3&#xff1a;Nuxt 中文站 - 直观的Web框架 Nuxt3文档 Nuxt 2.vue3&#xf…

fpga系列 HDL:Vivado 安装usb cable驱动

安装usb cable驱动 安装cable_drivers:在data\xicom\cable_drivers\nt64\dlc10_win7目录 安装digilent

数据分析-12-多个时间序列数据的时间戳对齐以及不同的方式补点

参考python时间序列数据的对齐和数据库的分批查询 1 问题场景与分析 1.1 场景 在医院的ICU里,须要持续观察病人的各项生命指标。这些指标的采集频率每每是不一样的(例如有些指标隔几秒采集一个,有些几个小时采集一个,有些一天采集一个),并且有些是按期的,有些是不按期的…

SpringMVC基于注解使用:上传下载

01-文件下载 基于servlet api的文件下载 注意一点content-disposition是以文件下载的方式打开意思是客户端地址栏不会改变&#xff0c; 如果注销了那句话就会跳转到下载图片的图片里面去&#xff0c;就在网页中显示了 基于spring ResponseEntity的文件下载 不支持缓冲区 一次…

使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果

使用 OpenCV 和 NumPy 进行图像处理&#xff1a;HSV 范围筛选实现PS抠图效果 在计算机视觉和图像处理领域&#xff0c;OpenCV 是一个非常强大的库&#xff0c;能够帮助我们执行各种图像操作。在这篇博客中&#xff0c;我们将通过一个简单的示例演示如何使用 OpenCV 和 NumPy 来…

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解&#xff08;VMD&#xff09;2. 双向时域卷积&#xff08;BiTCN&#xff09;3. 双向门控单元&#xff08;BiGRU&#xff09;4. …

基于sklearn的机器学习 — KNN

k-nearest neighbors&#xff08;KNN&#xff09;算法是监督机器学习中最简单但最常用的算法之一。 KNN通常被认为是一种惰性的学习算法&#xff0c;从技术上讲&#xff0c;它只是存储训练数据集&#xff0c;而不经历训练阶段。 KNN的原理是将新样本的特征与数据集中现有样本…

设计之道:ORM、DAO、Service与三层架构的规范探索

引言&#xff1a; 实际开发中&#xff0c;遵守一定的开发规范&#xff0c;不仅可以提高开发效率&#xff0c;还可以提高项目的后续维护性以及项目的扩展性&#xff1b;了解一下本博客的项目设计规范&#xff0c;对项目开发很有意义 一、ORM思想 ORM&#xff08;Object-Relation…

小琳AI课堂:大模型的发展历程:从创新到挑战

大家好&#xff0c;这里是小琳AI课堂。今天我们来聊聊大模型的发展历程&#xff0c;这是一段充满创新与挑战的故事。&#x1f680; 让我们追溯到20世纪50年代&#xff0c;那时计算机科学和人工智能还处于萌芽阶段。 早期探索&#xff08;1950s-1970s&#xff09; 早期探索是大…

网络安全应急响应技术原理与应用

网络安全应急响应概述 概念 为应对网络安全事件&#xff0c;相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作 网络安全应急响应组织建立与工作机制 网络安全应急响应预案内容与类型 常见网络安全应急事件场景与处理流程 应急演练&#xff1a;对假定…

iOS——APP启动流程

APP启动 APP启动主要分为两个阶段&#xff1a;pre-main和main之后&#xff0c;而APP的启动优化也主要是在这两个阶段进行的。 main之后的优化&#xff1a;1. 减少不必要的任务&#xff0c;2.必要的任务延迟执行&#xff0c;例如放在控制器界面等等。 APP启动的大致过程&#…

腾讯云 Spring Boot 安装 SSL 证书

linux和windows下&#xff0c;因为有ngxin&#xff0c;所以安装ssl证书都感觉比较容易&#xff0c;毕竟通过代理方式能够胜任大多数的https安全问题。 但是有些情况下&#xff0c;ngxin可能无法安装什么的&#xff0c;可能需要在spring boot下直接安装ssl&#xff0c;咋办&…

【漏洞复现】某客圈子社区小程序审计(0day)

0x00 前言 █ 纸上得来终觉浅,绝知此事要躬行 █ Fofa:"/static/index/js/jweixin-1.2.0.js"该程序使用ThinkPHP 6.0.12作为框架,所以直接审计控制器即可.其Thinkphp版本较高,SQL注入不太可能,所以直接寻找其他洞. 0x01 前台任意文件读取+SSRF 在 /app/api/c…

细致刨析JDBC ① 基础篇

“加油” 我已经说腻了&#xff0c;下次我要说&#xff1a;”祝你拥有随时停留和休息的底气“ —— 24.9.6 一、JDBC概述 1.JDBC的概念 JDBC&#xff1a;Java Database Connectivity&#xff0c;意为Java数据库连接 JDBC是Java提供的一组独立于任何数据库管理系统的API。 J…

单片机学习笔记

一、单片机帝国的诞生与发展 1.1 单片机的基本概念 单片机是一种集成电路芯片&#xff0c;采用超大规模的集成电路把具有数据处理功能的中央处理器存储器、输入输出端口、外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统。 一般而言&#xff0c;单片机也…

项目7-音乐播放器7(测试报告)

1.项目背景 音乐播放器采用前后端分离的方法来实现&#xff0c;基于SSM框架构建&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将其部署到云服务器上。 用户可以轻松注册登录&#xff0c;浏览丰富的音乐库&#xff0c;搜索喜欢的歌曲。系统支持多种音频格式播…

44. 数字序列中某一位的数字

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9844.%20%E6%95%B0%E5%AD%97%E5%BA%8F%E5%88%97%E4%B8%AD%E6%9F%90%E4%B8%80%E4%BD%8D%E7%9A%84%E6%95%B0%E5%AD%97/README.md 面试题 44. 数字序列中某…

超越传统:Reflection 70B如何革新AI语言处理

Reflection 70B&#xff1a;AI语言模型的新里程碑&#x1f680; AI领域迎来了革命性的变革&#xff0c;HyperWrite公司推出的开源AI大模型Reflection 70B&#xff0c;以其卓越的性能在多个基准测试中超越了GPT-4o和Llama 3.1。这款基于Meta的Llama 3.1 70B Instruct构建的模型…

electron 客户端 windows linux(麒麟V10)多系统离线打包 最新版 <二>

这节主要讲解以下 linux系统&#xff08;国产麒麟&#xff09;下&#xff0c;electron如何配置打包。 第一&#xff0c; 下载二进制包 和windows的一样&#xff0c;还是下载二进制包。只不过是linux版本的&#xff0c;千万不要下错了。 地址&#xff1a;CNPM Binaries Mirro…

大型视觉语言模型的有效性评估

原文地址&#xff1a;https://arxiv.org/abs/2403.04306 摘要&#xff1a;大型视觉语言模型&#xff08;LVLM&#xff09;的出现代表了通用人工智能的探索取得了显着的进步。然而&#xff0c;该模型在专业和一般任务中的有效性值得进一步研究。本文致力于评估流行的 LVLM 分别在…