[Lc6_记忆化搜索] 不同路径 | 解决智力问题 | 有序三元组中的最大值

目录

1.不同路径

题解

2140. 解决智力问题

题解

2873. 有序三元组中的最大值 

题解


1.不同路径

链接:62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?


题解

这个机器人位于左上角位置,每次只能向右和向下移动

  • 问从开始位置到终点一共有多少种不同的路径。
  • 我们下标从1开始计数,这样就少了很多边界情况。

接下来我们用记忆化搜索解决这个问题。

如果纯记忆化搜索我们只要两步就可以了。

  • 第一步 先想出暴搜(递归)的代码。
  • 第二步 暴搜代码改成记忆化搜索,但是前提是能否改!

1.暴搜(递归)

我们最后向求出的m,n位置有多少种不同的走法

  • 那么就这样搞dfs,dfs我给你两个参数,dfs(i,j)
  • 你直接给我返回1,1到达i,j有多少种走法。

具体dfs你内部怎么走我不关心,我相信你一定能够完成任务。

  • 接下来想想这个函数体 如何设计,我想从1,1到达这个三角的位置一共有多少种方式,其实只用关心两个位置就可以。
  • 因为想到达三角的位置,必须要从这两个圆圈到达,要求只能向右走向下走。
  • 如果此时我知道到达圆圈有多少种方式那在多走一步就走到三角了。
  • 也就是说到达圆圈有多少种方式,到达这个三角也有多少种方式。

因此仅需要达到两个圆圈有多少种方式加起来就是到达三角位置的方式 dfs(i-1,j) + dfs(i,j-1)。

递归出口 我们考虑某个位置的时候,我们仅会考虑它上面的位置以及左边的位置。

  • 有可能i=1的时候去考虑i-1不就越界了吗
  • i=0的时候不能从非法位置达到这里。
  • 同理j=0也是一种非法情况,我们既要考虑上边也要考虑左边。因此

i == 0 || j == 0 return 0;

但还有一种隐藏递归出口

  • 当i == 1 && j == 1的时候是位于起点的
  • 上面和左边都没有所以需要特殊处理 i == 1 && j == 1 return 1
class Solution {
public:int uniquePaths(int m, int n) {//爆搜return dfs(m,n);}int dfs(int m,int n){//出口if(m==0 || n==0) return 0;if(m==1 && n==1) return 1;return dfs(m-1,n)+dfs(m,n-1);}
};

上面会超时,下面看看能否暴搜的代码改成记忆化搜索。

在递归过程种发现大量重复的相同问题就可以用记忆化搜索

记忆化搜索

我们发现在递归过程种发现大量重复的相同问题因此可以用记忆化搜索

搞一个备忘录

  • 递归之前,查找一下备忘录
  • 返回之前,把结果存在备忘录中

搞一个备忘录 上一道题是搞一个一维数组,但是这道题dfs函数里面是有两个可变参数,i和j一直在变化。

  • 里面的值是int,因此我可以搞一个int [m+1][n+1] 二维数组。
  • 因为要访问到m,n的位置。

进前 瞅瞅。return 前 存存

class Solution {
public:vector<vector<int>> memo;int uniquePaths(int m, int n) {//记忆化搜索memo.resize(m+1,vector<int>(n+1,0));return dfs(m,n);}int dfs(int m,int n){if(memo[m][n]) return memo[m][n];//出口if(m==0 || n==0) return 0;if(m==1 && n==1) return 1;memo[m][n]=dfs(m-1,n)+dfs(m,n-1);return dfs(m-1,n)+dfs(m,n-1);}
};

解下来把记忆化搜索改成动态规划。

  1. 多加一层的 初始化
  2. 循环内 要注意起点的值 continue ,防止被修改

2140. 解决智力问题

链接:2140. 解决智力问题

给你一个下标从 0 开始的二维整数数组 questions ,其中 questions[i] = [pointsi, brainpoweri]

这个数组表示一场考试里的一系列题目,你需要 按顺序 (也就是从问题 0 开始依次解决),针对每个问题选择 解决 或者 跳过 操作。解决问题 i 将让你 获得 pointsi 的分数,但是你将 无法 解决接下来的 brainpoweri 个问题(即只能跳过接下来的 brainpoweri 个问题)。如果你跳过问题 i ,你可以对下一个问题决定使用哪种操作。

  • 比方说,给你 questions = [[3, 2], [4, 3], [4, 4], [2, 5]]
    • 如果问题 0 被解决了, 那么你可以获得 3 分,但你不能解决问题 12
    • 如果你跳过问题 0 ,且解决问题 1 ,你将获得 4 分但是不能解决问题 23

请你返回这场考试里你能获得的 最高 分数。


题解

刚好今天的每日一题

  • 暴力 选 or 不选 会超时

class Solution {
public:typedef long long ll;queue<vector<int>> q;ll ret;long long mostPoints(vector<vector<int>>& questions) {//dpdfs(questions,0,0);return ret;}void dfs(vector<vector<int>>& questions,int p,ll count){if(p>=questions.size()) //向下 再向上 //暴力 是会经历两次的{ret=max(ret,count);return;}
//选dfs(questions,p+questions[p][1]+1,count+questions[p][0]);
//不选dfs(questions,p+1,count); } 
};

采用 记忆化搜索,记录 结果的记忆化递归,避免 重复进行

class Solution 
{int n = 0;unordered_map<int, long long> memo;
public:long long dfs(vector<vector<int>>& questions, int pos){if (pos >= n)return 0;if (memo.count(pos))return memo[pos];// 选 - 跳到 pos + brain + 1long long ret = questions[pos][0] + dfs(questions, pos + questions[pos][1] + 1);// 不选 - 跳到 pos + 1ret = max(ret, dfs(questions, pos + 1));memo[pos] = ret; //记录 结果的记忆化递归return ret;}long long mostPoints(vector<vector<int>>& questions){n = questions.size();return dfs(questions, 0);}
};

采用动态规划,优化


2873. 有序三元组中的最大值 

链接:2873. 有序三元组中的最大值 I

给你一个下标从 0 开始的整数数组 nums

请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回 0

下标三元组 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k]


题解

暴力

class Solution {
public:typedef long long ll;long long maximumTripletValue(vector<int>& nums) {//暴力ll ret=0;int n=nums.size();for(int i=0;i<n-2;i++){for(int j=i+1;j<n-1;j++){for(int k=j+1;k<n;k++){ret = max(ret,(ll)(nums[i] - nums[j]) * nums[k]);//!!!强转}}}return ret;}
};

注意 max 比较对 ll 的强转~

解法二:

类比:11.盛水最多的容器

利用单调性来进行空间换时间

class Solution {
public:typedef long long ll;long long maximumTripletValue(vector<int>& nums) {//利用单调性int n=nums.size();if (n < 3) return 0;  // 🌟 新增边界条件ll ret=0;vector<int> max_left(n,0);  //ivector<int> max_right(n,0);  //k//空间换时间for(int j=1;j<n;j++){max_left[j]=max(max_left[j-1],nums[j-1]);
//!!!!!存储当前位置所对应的最大左右值}for(int j=n-2;j>=0;j--){max_right[j]=max(max_right[j+1],nums[j+1]);}for(int j=1;j<n-1;j++){ret=max(ret,(ll)(max_left[j]-nums[j])*max_right[j]);}return ret;}
};

//!!!!!存储当前位置所对应的最大左右值

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

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

相关文章

软件重构与项目进度的矛盾如何解决

软件重构与项目进度之间的矛盾可以通过明确重构目标与范围、采用渐进式重构策略、优化项目管理流程、提高团队沟通效率、建立重构意识文化等方式解决。其中&#xff0c;采用渐进式重构策略尤为关键。渐进式重构是指在日常开发过程中&#xff0c;以小步骤持续进行重构&#xff0…

多台服务器上docker部署 Redis 集群

规划集群节点 确保你的服务器有固定 IP&#xff0c;比如&#xff1a; 172.16.17.100 172.16.17.101 172.16.17.102 每台服务器运行 2 个 Redis 节点&#xff0c;总共 6 个节点&#xff0c;满足 Redis Cluster 最小节点数要求。 2. 在每台服务器上运行 Redis 在每台服务器上执行…

【Pandas】pandas DataFrame dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型 pandas.DataFrame.dtypes pandas.DataFrame.dtypes 属性用…

如何实现局域网内无痛访问Jupyter Notebook?

Jupyter Notebook是数据科学和机器学习领域非常常用的交互式开发环境。默认情况下&#xff0c;Jupyter Notebook启动后只能本地访问&#xff0c;并且会自动生成一个token用于身份验证。当需要从其他电脑远程访问时&#xff0c;往往需要对配置进行修改。 本文将详细介绍如何通过…

[Windows] eDiary 4.3.6 日记软件

[Windows] eDiary 链接&#xff1a;https://pan.xunlei.com/s/VOMq6xmKTbEJtNaW-BXZ7KKSA1?pwdcrvu# 【应用功能】 加密 无论本地还是云端&#xff0c;都可以选择高强度加密。系统以用户密码为种子&#xff0c;对数据进行…

掌握 Flexbox 布局:为容器添加竖向滚动条的完美方案

掌握 Flexbox 布局&#xff1a;为容器添加竖向滚动条的完美方案 前言 在现代网页设计中&#xff0c;Flexbox 布局因其灵活性和强大的对齐功能而备受欢迎。然而&#xff0c;在实际开发过程中&#xff0c;我们有时会遇到需要在一个具有最小高度的 Flex 容器中实现内容溢出时显示…

Node.js v22.14.0 多平台安装指南:Windows、Linux 和 macOS 详细教程

Node.js作为现代Web开发的基石&#xff0c;持续为开发者带来性能提升和新特性支持。本文将详细介绍在Windows、macOS和Linux系统上安装最新Node.js的多种方法&#xff0c;助您快速搭建高效的JavaScript开发环境。 &#x1f4e6; 当前最新版本 截至2025年4月&#xff0c;Node.…

动态规划学习——回文子串系列问题【C++】

一&#xff0c;回文子串 题目链接&#xff1a;LCR 020. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 【问题描述】 求一个字符串中有多少个回文子串&#xff0c;其中一个字符也算是一个回文子串。 【解法】 动态规划 求一个字符串中回文子串的个数&#xff0c;我么可…

My first day in QT programming

My first QT code this->setWindowTitle("HelloWorld"); //设置窗口名称 this->resize(400, 300); //设置窗口大小 QPushButton* btn new QPushButton; //新建按钮组件 btn->setParent(this); //为按钮指定父对象 …

基于python开发的邮箱合并群发工具

智能邮件群发系统 一个基于Python和PyQt5开发的智能邮件群发工具&#xff0c;支持Word模板和Excel数据源的自动匹配&#xff0c;具有现代化UI界面和友好的用户体验。 Github项目地址&#xff1a;https://github.com/liugang926/Auto-mail-sent.git dist目录有编译好的exe程序&…

大模型-提示词(Prompt)技巧

1、什么是提示词&#xff1f; 提示词&#xff08;Prompt&#xff09;是用户发送给大语言模型的问题、指令或请求&#xff0c;用来明确地告诉模型用户想要解决的问题或完成的任务&#xff0c;是大语言模型理解用户需求并据此生成相关、准确回答或内容的基础。对于大语言模型来说…

Android开发:support.v4包与AndroidX

Android中的support.v4包与AndroidX support.v4包概述 Android Support Library中的android.support.v4包是Google为保持Android应用向后兼容而提供的重要支持库集合。它主要解决以下问题&#xff1a; API版本兼容&#xff1a;让新版API能在旧版Android系统上使用功能增强&a…

TCP-IP模型

书接上回&#xff08;OSI通信模型&#xff09; TCP-IP协议结构 &#xff08;略讲&#xff09; ARP&#xff1a;IP-->MAC RARP&#xff1a;MAC-->IP ICMP&#xff1a;控制报文信息协议&#xff0c;主要是涉及到主机就去连接路由器时控制传输报文&#xff08…

雪花算法生成的主键存在哪些问题,为什么不能使用自增ID或者UUID做MySQL的主键

MySQL 分布式架构中的主键选择&#xff1a;自增ID、UUID与雪花算法 为什么MySQL分布式架构中不能使用自增主键&#xff1f; 在分布式架构中&#xff0c;自增主键存在以下问题&#xff1a; 主键冲突风险&#xff1a;多个数据库实例同时生成自增主键会导致ID重复分片不均匀&am…

RapidJSON 处理 JSON(高性能 C++ 库)(四)

第四部分:RapidJSON 处理 JSON(高性能 C++ 库) 📢 快速掌握 JSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 RapidJSON 课程视频!🎬 视频里会用更直观的方式讲解 RapidJSON 的核心概念、实战技巧,并配有…

chromem-go + ollama + bge-m3 进行文档向量嵌入和查询

Ollama 安装 https://ollama.com/download Ollama 运行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文档嵌入和查询 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…

【LeetCode 题解】数据库:180. 连续出现的数字

一、问题描述 给定一个Logs表&#xff0c;包含自增 ID 和数字字段&#xff1a; CREATE TABLE Logs (id INT PRIMARY KEY AUTO_INCREMENT,num VARCHAR(50) );要求编写 SQL 查询&#xff0c;找出所有至少连续出现三次的数字。例如&#xff1a; --------- | id | num | -------…

MaxEnt模型进阶:基于R语言自动化与GIS空间建模的物种栖息地精准预测

生物多样性的空间分布规律及其对环境变化的响应机制&#xff0c;是生态学与地理学研究的前沿议题。在气候变化加剧和人类活动干扰的双重压力下&#xff0c;如何精准预测物种潜在分布范围、识别关键环境驱动因子&#xff0c;已成为制定生物保护策略的核心科学问题。物种分布模型…

缓存雪崩解决方案:二级缓存VS随机TTL

背景 在学习缓存雪崩的时候&#xff0c;了解到有二级缓存和随机TTL两个解决方案&#xff0c;但是在学习之后&#xff0c;个人认为二级缓存本质上还是利用两层缓存的过期时间不一致来实现缓存过期时间随机化&#xff0c;这不就是和随机TTL一样吗&#xff0c;故有了这篇思考&…

Android View事件分发机制深度解析

在Android面试中&#xff0c;关于View事件分发机制的考察往往不仅限于基础流程&#xff0c;更关注底层原理、性能优化和实际应用场景。以下是针对面试的全面回答策略&#xff1a; 一、基础回答框架 核心三要素&#xff1a; 传递流程 "事件分发遵循Activity → Window →…