记忆化搜索(5题)
是什么? 是一个带备忘录的递归
如何实现记忆化搜索
1.添加一个备忘录(建立一个可变参数和返回值的映射关系)
2.递归每次返回的时候把结果放到备忘录里
3.在每次进入递归的时候往备忘录里面看看。
目录
1.斐波那契数列
2.不同路径
3.最长递增子序列
4.猜数字大小2
5.矩阵中最长的递增路径
1.斐波那契数列
LCR 126. 斐波那契数 - 力扣(LeetCode)

我们再看看动态规划的做法。我们发现其实两者具有一一对应的关系,只不过一种是用递归形式呈现,另一种是用递推形式呈现

小问题:
1. 所有的递归(暴搜、深搜),都能改成记忆化搜索吗?
不是的,只有在递归的过程中,出现了大量完全相同的问题时,才能用记忆化搜索的方式优化
2.带备忘录的递归vs动态规划 vs记忆化搜索
本质上是一回事
3.自顶向下 vs 自低向上
不同的看待问题的方式
4.暴搜->记忆化搜索->动态规划
可以为我们的动态规划提供一个方向
我们创建一个备忘录的时候需要在里面填入一个不可能取到的值,以此来判断备忘录是否已经更新
class Solution {
public:int memo[110];//一个备忘录int fib(int n) {memset(memo, -1, sizeof(memo));return dfs(n);}int dfs(int n){if(memo[n] != -1)return memo[n];//每次进入的时候查看备忘录里面是否存值if(n == 1){memo[1] = 1;return memo[1];//返回之前把值存到备忘录里面}else if(n == 0){memo[0] = 0;return memo[0];}else {memo[n] = (dfs(n-1) + dfs(n - 2))%1000000007;return memo[n];}}
};
2.不同路径
62. 不同路径 - 力扣(LeetCode)
1.暴力搜索(会超时)
class Solution {
public:int uniquePaths(int m, int n) {return dfs(m,n);}int dfs(int i, int j){if(i == 0 || j == 0)return 0;if(i == 1 && j == 1)return 1;return dfs(i - 1, j) + dfs(i, j - 1);}
};
2.记忆化搜索
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> memo(m +1, vector<int>(n + 1));for(int i = 0; i < m + 1; i++){for(int j = 0; j < n + 1; j++){memo[i][j] = -1;}}return dfs(m,n,memo);}int dfs(int i, int j, vector<vector<int>> & memo){if(memo[i][j] != -1)return memo[i][j];if(i == 0 || j == 0){return 0;}if(i == 1 && j == 1){memo[1][1] = 1;return memo[1][1];}memo[i][j] = dfs(i - 1, j,memo) + dfs(i, j - 1,memo);return memo[i][j];}
};
3.最长递增子序列
300. 最长递增子序列 - 力扣(LeetCode)
1.暴搜(会超时)
dfs(pos)的任务是返回以nums[pos]为开头的最长子序列
我们在主函数里面从头开始遍历一次,找到最大的那个,ret 一开始为0.
在dfs函数中,ret一开始为1,因为已经进入dfs函数的情况下最少也有一个数。
我们从pos的下一位开始,遍历到结尾,每遍历到一个位置我们判断这个值是否比nums【i】大,如果更大说明它可以连接到nums【i】后面,我们再更新ret, ret = max(ret, dfs(nums, i) + 1);
class Solution {
public:int n;int lengthOfLIS(vector<int>& nums) {int ret = 0;n = nums.size();for(int i = 0; i < n; i++){ret = max(dfs(nums, i), ret);}return ret;}int dfs(vector<int>& nums, int pos){int ret = 1;for(int i = pos + 1; i < n; i++){if(nums[i] > nums[pos]){ret = max(ret, dfs(nums, i) + 1);}}return ret;}
};
2.记忆化搜索
记录数据需要在返回之前记录。
class Solution {
public:int n;int lengthOfLIS(vector<int>& nums) {int ret = 0;n = nums.size();vector<int> memo(n);for(int i = 0; i < n; i++){ret = max(dfs(nums, i,memo), ret);}return ret;}int dfs(vector<int>& nums, int pos,vector<int>& memo){if(memo[pos] != 0)return memo[pos];int ret = 1;for(int i = pos + 1; i < n; i++){if(nums[i] > nums[pos]){ret = max(ret, dfs(nums, i, memo) + 1);}}memo[pos] = ret;return ret;}
};
3.递归代码
dp[i]表示的是从i下标开始最大的一个子序列。
因此我们从末尾开始填dp表,每个位置最小的子序列是自身,因此dp表每个位置先赋值为1.
每次进行比较之后才更新
if(nums[i] < nums[j])
{
dp[i] = max(dp[i], dp[j] + 1);
}
最后的结果从dp表里面挑一个最大的即可。
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();int ret = 0;vector<int> dp(n,1);for(int i = n - 1; i >= 0; i--){for(int j = i + 1; j < n; j++){if(nums[i] < nums[j]){dp[i] = max(dp[i], dp[j] + 1);}}ret = max(ret, dp[i]);}return ret;}
};
4.猜数字大小2
375. 猜数字大小 II - 力扣(LeetCode)
1.暴搜(会超时)
这题让我们求 不管猜的是哪个数字 确保获胜 的最小金额
首先,猜的策略有很多种,我们用暴力搜索,从小到大依次以某个值为根,然后分出两个树,继续对两个树进行相同的操作。
我们要确保无论它让我们猜哪个值都要获胜,那么就应该找每棵树里面花钱最多的策略,
我们使得int l = dfs(left,i - 1);
int r = dfs(i + 1, right);
花钱最多的 即根节点+ 左右两树中花钱多的即 i + max(l, r) ,
同时又要最少金额,那么就从各种一定会获胜的金额中取出最小的即可

class Solution {
public:int getMoneyAmount(int n) {return dfs(1, n);}int dfs(int left, int right){if(left >= right)return 0;int ret = INT_MAX;for(int i = left; i <= right; i++){int l = dfs(left,i - 1);int r = dfs(i + 1, right);ret = min(ret, i + max(l, r));}return ret;}
};
2.记忆化搜索
class Solution {
public:int getMoneyAmount(int n) {vector<vector<int>> memo(n + 1, vector<int>(n + 1, -1));return dfs(1, n, memo);}int dfs(int left, int right, vector<vector<int>> & memo){if(left >= right)return 0;if(memo[left][right] != -1)return memo[left][right];int ret = INT_MAX;for(int i = left; i <= right; i++){int l = dfs(left,i - 1, memo);int r = dfs(i + 1, right, memo);ret = min(ret, i + max(l, r));}memo[left][right] = ret;return ret;}
};
5.矩阵中最长的递增路径
LCR 112. 矩阵中的最长递增路径 - 力扣(LeetCode)
class Solution {
public://int check[210][210];int m,n;int dx[4] = {0 , -1, 0, 1};int dy[4] = {-1, 0, 1, 0};int longestIncreasingPath(vector<vector<int>>& matrix) {m = matrix.size();n = matrix[0].size();vector<vector<int>> memo(m, vector<int>(n, -1));int ret = 0;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){ret = max(ret,dfs(i,j,matrix,memo));}}return ret;}int dfs(int x, int y, vector<vector<int>>& matrix, vector<vector<int>>& memo){if(memo[x][y] != -1)return memo[x][y];int ret = 1;for(int k = 0; k < 4; k++){int i = x + dx[k];int j = y + dy[k];if(i >= 0 && i < m && j >= 0 && j < n ){if(matrix[i][j] > matrix[x][y]){ret = max(ret, dfs(i,j,matrix,memo) + 1);}}}memo[x][y] = ret;return ret;}
};
相关文章:
记忆化搜索(5题)
是什么? 是一个带备忘录的递归 如何实现记忆化搜索 1.添加一个备忘录(建立一个可变参数和返回值的映射关系) 2.递归每次返回的时候把结果放到备忘录里 3.在每次进入递归的时候往备忘录里面看看。 目录 1.斐波那契数列 2.不同路径 3.最…...
【游戏设计原理】96 - 成就感
成就感是玩家体验的核心,它来自完成一件让自己满意的任务,而这种任务通常需要一定的努力和挑战。游戏设计师的目标是通过合理设计任务,不断为玩家提供成就感,保持他们的参与热情。 ARCS行为模式(注意力、关联性、自信…...
Java小白入门教程:内置数据类型(四类八种)和引用数据类型
目录 一、内置数据类型(四类八种) 1. 整数类型(四种子类型) 2. 浮点类型(两种子类型) 3. 字符类型(一种子类型) 4. 布尔类型(一种子类型) 二、引用数据类…...
【设计测试用例自动化测试性能测试 实战篇】
🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 设计测试用例…...
20-30 五子棋游戏
20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图(核心精讲50个案例)2023最新教程的第21集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https:…...
抽象类与抽象方法详解
目录 一、 基本概念 1.抽象类(Abstract Class): 2.抽象方法(Abstract Method): 二、示例代码 抽象类 抽象方法 三、抽象类的使用场景 四、 抽象类与接口的对比 五、注意事项 六、总结 一、 基本概…...
受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )
受击反馈HitReact 设置角色受击标签 (GameplayTag基本了解待补充) 角色监听标签并设置移动速度 创建一个受击技能,并应用GE 实现设置角色的受击蒙太奇动画 实现角色受击时播放蒙太奇动画,为了保证通用性,将其设置为一个函数,并…...
应用程序中处理文件上传的方法
在应用程序中处理文件上传通常涉及以下几个步骤: 一、前端准备 前端负责收集文件,并通过 HTTP 请求将其发送到服务器。常见的方法包括: ①HTML <form>; 表单:使用 enctype="multipart/form-data" 属性指定表单支持文件上传。 ②JavaScript (AJAX):可以使…...
Java进阶six junit单元测试,反射,注解,动态代理
前言 Java进阶课程的第六篇,也是最后一篇,junit单元测试,反射,注解,动态代理相关内容 包含知识点 junit单元测试 反射 1.内部类Student: 包含私有/公共字段和方法 包含默认构造器和私有构造器 2.获取Class对象的三种方式: .…...
STM32 LED呼吸灯
接线图: 这里将正极接到PA0引脚上,负极接到GND,这样就高电平点亮LED,低电平熄灭。 占空比越大,LED越亮,占空比越小,LED越暗 PWM初始化配置 输出比较函数介绍: 用这四个函数配置输…...
栈和队列特别篇:栈和队列的经典算法问题
图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…...
用一个例子详细说明python单例模式
单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这在需要控制资源(如数据库连接、文件系统等)的访问时非常有用。 下面是一个使用Python实现单例模式的例子: class Singleton:…...
Kotlin 委托详解
Kotlin 委托详解 引言 Kotlin 作为一种现代化的编程语言,在 Android 开发等领域得到了广泛的应用。在 Kotlin 中,委托(Delegation)是一种强大的特性,它可以让我们以更简洁的方式实现代码的复用和扩展。本文将详细解析…...
什么是词嵌入?Word2Vec、GloVe 与 FastText 的区别
自然语言处理(NLP)领域的核心问题之一,是如何将人类的语言转换成计算机可以理解的数值形式,而词嵌入(Word Embedding)正是为了解决这个问题的重要技术。本文将详细讲解词嵌入的概念及其经典模型(Word2Vec、GloVe 和 FastText)的原理与区别。 1. 什么是词嵌入(Word Em…...
2024年数据记录
笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统,笔者原力值超过99.99%的用户 其他年度数据...
DBO优化最近邻分类预测matlab
蜣螂优化算法(Dung Beetle Optimizer,简称 DBO)作为一种新兴的群智能优化算法,于 2022 年末被提出,其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...
Harbor 部署
harbor镜像仓库搭建 版本v2.10.3 文章目录 一. docker 安装 harbor1. harbor 配置http访问1.1 下载harbor二进制包1.2 修改配置文件1.3 运行1.4 访问 2.【可选】harbor 配置https访问2.1 自签证书2.1 修改配置文件2.3 修改hosts文件2.4 运行2.5 访问 二. k8s 安装harbor1 .安装…...
PSpice for TI体验
前言 基于 从零开始学 PSpice for TI 仿真工具 - 手把手操作实训课程_哔哩哔哩_bilibili 体验PSpice for TI的功能,并记录下来。文章内容大部分都参考自视频,可以理解成图文版。目前发现是没有支持中文语言,而且部分仿真,时间消耗…...
数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序,二分查找必在其中;排序若要使用…...
苯乙醇苷类化合物的从头生物合成-文献精读108
Complete pathway elucidation of echinacoside in Cistanche tubulosa and de novo biosynthesis of phenylethanoid glycosides 管花肉苁蓉中松果菊苷全生物合成途径解析及苯乙醇苷类化合物的从头生物合成 摘要 松果菊苷(ECH)是最具代表性的苯乙醇苷…...
【C++】设计模式详解:单例模式
文章目录 Ⅰ. 设计一个类,不允许被拷贝Ⅱ. 请设计一个类,只能在堆上创建对象Ⅲ. 请设计一个类,只能在栈上创建对象Ⅳ. 请设计一个类,不能被继承Ⅴ. 请设计一个类,只能创建一个对象(单例模式)&am…...
CAN总线数据采集与分析
CAN总线数据采集与分析 目录 CAN总线数据采集与分析1. 引言2. 数据采集2.1 数据采集简介2.2 数据采集实现3. 数据分析3.1 数据分析简介3.2 数据分析实现4. 数据可视化4.1 数据可视化简介4.2 数据可视化实现5. 案例说明5.1 案例1:数据采集实现5.2 案例2:数据分析实现5.3 案例3…...
解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题
一般服务器会通过镜像分身或者容器的方式,一个ip分出多个端口给多人使用,但如果碰到需要连接同一user,同一个ip,不同端口的情况,vscode就无法识别,如下图所示,vscode无法区分该ip下不同端口的连接ÿ…...
AJAX案例——图片上传个人信息操作
黑马程序员视频地址: AJAX-Day02-11.图片上传https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p26 图片上传 <!-- 文件选择元素 --><input type"file"…...
团体程序设计天梯赛-练习集——L1-029 是不是太胖了
前言 5分级别里面目前做到的最难的一道题,但是非常简单,5分的题看看写点代码就行了。 L1-029 是不是太胖了 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数…...
ubuntu20.04.6下运行VLC-Qt例子simple-player
下载examples-master.zip(https://github.com/vlc-qt/examples),编译运行simple-player 参考链接: https://blog.csdn.net/szn1316159505/article/details/143743735 本文运行环境 Qt 5.15.2 Qt creator 5.0.2 主要步骤…...
LabVIEW温度修正部件测试系统
LabVIEW温度修正部件测试系统 这个基于LabVIEW的温度修正部件测试系统旨在解决飞行器温度测量及修正电路的测试需求。该系统的意义在于提供一个可靠的测试平台,用于评估温度修正部件在实际飞行器环境中的性能表现,从而确保飞行器的安全性和可靠性。 系统…...
细说机器学习算法之ROC曲线用于模型评估
系列文章目录 第一章:Pyhton机器学习算法之KNN 第二章:Pyhton机器学习算法之K—Means 第三章:Pyhton机器学习算法之随机森林 第四章:Pyhton机器学习算法之线性回归 第五章:Pyhton机器学习算法之有监督学习与无监督…...
Python3 【装饰器】项目实战:5个新颖的学习案例
Python3 【装饰器】项目实战:5个新颖的学习案例 以下是 5 个使用 Python 装饰器的综合应用项目,这些项目具有新颖性、前瞻性和实用性。每个项目都包含完整的代码、解释说明、测试案例和执行结果。 项目 1:API 请求限流器 描述:实…...
【深度学习】 UNet详解
UNet 是一种经典的卷积神经网络(Convolutional Neural Network, CNN)架构,专为生物医学图像分割任务设计。该模型于 2015 年由 Olaf Ronneberger 等人在论文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中首次提出&…...
