DFS 算法:记忆化搜索

【DFS+记忆化搜索】矩阵中的最长递增路径 可以对上述DFS进行优化,比如第一次我们枚举【0,0】开头的所有的可能时就会得到这个位置连出去的最长递增序列的长度,如果我们在枚举其他位置为起点时,在dfs过程中走到了【0,0】位置,我们又要进行一次以【0,0】开头的递增序列长度的计算,此时可以将以这个位置为起点的最长递增序列的长度进行存储,这样当dfs到该位置的时候,如果该位置之前已经被遍历过得到结果则之间返回记录的结果。对于矩阵的搜索,枚举每一个位置可能的满足递增的序列,在dfs过程中维护一个最长递增序列长度的字段。. - 力扣(LeetCode) 阅读详情

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章

  • 无

此系列更新频繁,求各位读者点赞
关注我可以了解更多内容哦
偷偷告诉你,我正在冲 1100 粉 {\color{Gray} {\small 偷偷告诉你,我正在冲1100粉} } 偷偷告诉你,我正在冲1100粉
你们有什么想了解的可以发在评论区,我会仔细的看 {\color{Gray} {\small 你们有什么想了解的可以发在评论区,我会仔细的看} } 你们有什么想了解的可以发在评论区,我会仔细的看
1100 粉时我会抓几个做文章 {\color{Gray} {\small1100粉时我会抓几个做文章} } 1100粉时我会抓几个做文章


今天我们学什么

今天我们要学习的是——记忆化搜索!
这是一种以空间换时间的算法,能有效提高效率
我们将会以一道“简单”的题入手,带你了解这个“有趣”的算法

例题

那么例题就是——斐波那契数列!
题目如下

斐波那契数列

题目描述

有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。
现在,我们有一对刚出生的这种兔子,那么,第n个月时,我们会有多少对兔子呢?
假设所有的兔子都不会死亡。

题目输入

输入仅一行,包含一个自然数n。 n<=46

题目输出

输出仅一行,包含一个自然数,即第n个月时兔子的对数。

样例

样例 1
输入
5
输出
5

递推做法

我知道你想怎么做,这样呗

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll f[50];
int main() {
	int n;
	cin >> n;
	f[1] = f[2] = 1;  // 初始化
	for (int i = 3; i <= n; i++) {
		f[i] = f[i - 1] + f[i - 2];
	}
	cout << f[n];
	return 0;
}

没错,这种代码效率高,是做这道题的不二之选
但是,我们想要递归的代码

递归

此时,作为OIer / coder的你 打出了GG 打出来了一下的代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll f(int x) {
	if (x == 1 || x == 2) {
		return 1;    // 若 x 为 1 或者 2 ,则返回 1
	}
	return f(x - 1) + f(x - 2);
}
int main() {
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

此时你看到了满屏的
在这里插入图片描述
这是为什么呢?
我们来画一颗搜索树(以5为例)
请添加图片描述

此时,我们可以发现
有些地方重复了!
请添加图片描述
我们此时为了快,要努力去把重复部分的计算次数变成1次而不是多次
我们可以在此处添加一个ans数组来记忆状况,这就是记忆化搜索,具体如下(需要自行理解):

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll ans[50];
ll f(int x) {
	if (x == 1 || x == 2) {
		return 1;     // 若 x 为 1 或者 2 ,则返回 1
	}
	if (ans[x]) {
		return ans[x];   // 若 ans[x] 已经计算,则直接返回 ans[x]
	}

	return ans[x] = f(x - 1) + f(x - 2);  
	/*
	上面的一行代码使用了简写,也可以写作如下代码
	
	ans[x] = f(x - 1) + f(x - 2);
	return ans[x];
	
	上面的更加简洁,下面的更加容易理解
	*/
}
int main() {
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

怎么样,记忆化搜索是不是很简单呢?

总结

以下内容使用了AI大模型

记忆化搜索是一种以空间换时间的算法,用于优化递归中的重复计算。通过建立一个记忆数组,将已经计算过的结果保存起来,下次需要计算时直接查询数组,避免重复计算。记忆化搜索可以有效提高算法的效率,特别适用于递归问题。

在记忆化搜索中,需要注意以下几点:
- 在递归函数中添加记忆数组,用于保存已经计算过的结果;
- 在递归函数中,先查看记忆数组中是否已经有计算好的结果,若有则直接返回,若无则进行计算;
- 在计算完成后,将结果保存到记忆数组中;
- 主函数中调用递归函数,并输出结果。

记忆化搜索的实现步骤如下:
1. 创建记忆数组,大小与递归函数的参数范围相对应;
2. 在递归函数中,先检查记忆数组是否有计算好的结果,若有则直接返回结果;
3. 若记忆数组中没有计算好的结果,则进行计算,并将结果保存到记忆数组中;
4. 在主函数中调用递归函数,并输出结果。

记忆化搜索的优点是能够避免重复计算,提高算法效率。缺点是需要额外的空间来保存计算结果。

记忆化搜索在解决递归问题时非常有用,可以大大提高算法的效率。在实际应用中,可以根据问题的特点和递归深度来决定是否使用记忆化搜索。

再见!记得关注我哦

深度优先搜索(DFS)剪枝:记忆化搜索(C++) 今天我们来讲一下深搜的剪枝方法中的一个:记忆化搜索。顾名思义,记忆化搜索就是让程序记住一些东西,然后可以在需要用的时候可以瞬间调用,不需要再进行一次复杂的计算!首先,记忆需要大脑来存储数据,什么来模拟大脑? 数组其次,记忆需要现有的知识用来记住,知识从哪里来? 以前求出的数据。这样,我们如果要用到以前求过的数据,就可以从数组中调用,可以大大提高我们程序的运行速度。 阅读详情

相关推荐

从网格剖分到结果外推:一文拆解HFSS快速扫频(Fast Sweep)的底层逻辑与性能调优

本文深入解析了HFSS快速扫频(Fast Sweep)技术的底层逻辑与性能调优方法。通过ALPS算法实现频带外推,快速扫频相比离散扫频和插值扫频能提升3-5倍计算效率,特别适用于天线阵列、微波滤波器等宽频带分析场景。文章详细介绍了算法架构、参数优化策略及工程实践中的精度保障机制,帮助工程师高效完成电磁仿真。

weixin_28693447的博客 94

算法数据结构——记忆化搜索(Memoization Search)算法超详细总结加应用案例讲解

记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果时,它首先检查是否已经计算过该问题。如果已经计算过,则直接返回已经存储的结果;否则,计算该问题,并将结果存储下来以备将来使用。举个例子,比如「斐波那契数列」的定义是:$f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)$。

白话机器学习 1万+

基于的公司考勤系统(程序+开题报告)(开题报告+源码)

我们将研究和设计系统的架构和功能模块,包括员工信息管理模块、部门信息管理模块、考勤信息记录模块、工资信息计算模块、请假信息处理模块、奖惩信息管理模块、公告信息发布模块、上班打卡模块以及加班申请模块等。目的: 本项目旨在设计并实现一个基于的公司考勤系统,通过该系统,可以实现对员工、部门信息、考勤信息、工资信息、请假信息、奖惩信息、公告信息、上班打卡、加班申请等功能的统一管理。基于的公司考勤系统的设计与实现,旨在通过自动化技术提高考勤管理的效率和准确性,为企业管理提供有力的数据支持。最终成品以下面运行环境。

迟限程序设计 997

【算法】DFS系列之 记忆化搜索

记忆化搜索是一种典型的空间换时间的思想,可以看成带备忘录的爆搜递归。搜索的低效在于没有能够很好地处理重叠子问题。在搜索过程中,会有很多重复计算,如果我们能记录一些状态的答案,就可以减少重复搜索量。动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。

NeeEk0的博客 2374

用PyTorch和snnTorch库5分钟搞定一个脉冲神经网络(SNN)手写数字识别Demo

本文详细介绍了如何使用PyTorch和snnTorch库快速搭建一个脉冲神经网络(SNN)手写数字识别Demo。通过模拟生物神经元的脉冲发放机制,SNN在低功耗场景中展现出独特优势。文章涵盖环境配置、数据预处理、模型构建、训练评估全流程,并提供了性能优化技巧和常见问题解决方案,帮助开发者在5分钟内实现高效的SNN应用。

weixin_29300931的博客 393

便携式水下动态实时视频色彩还原设备,一键快速实现对水下偏色视频和图像的色彩还原处理

便携式水下动态实时视频色彩还原,一键快速对水下图像进行色彩校正,清晰度提升和亮度均衡处理,为水下资源勘探和科学考古,海洋生态环境监测,水下机器作业等应用提供有力的协助

weixin_43518680的博客 633

记忆化搜索

记忆化搜索

Lucas_FC_的博客 815

【开关电源篇】开关电源——只需这三个阶段,从电源小白到维修大神

🔌 该篇为的原创文章跳转目录,小二持续更新跳转链接,尽情关注!

2301_81299416的博客 2397

记忆化搜索简介

很多人应该都被动态规划折磨过(+1)。其实我觉得动态规划是搜索的一种优化写法,搜索就是把所有可能的结果都找出来,选择最合理的一个作为答案输出,动态规划可以把搜索得到的中间结果存储起来。而记忆化搜索,其实本质上就是动态规划,在得出一个结果后,存储起来,等到下一次搜索时,如果发现已经存储了这个状态的答案,则直接返回。记忆化搜索可以做常数优化。

Lucky_Pupil的博客 443

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 423

Microsemi Libero使用技巧1——查看芯片资源占用情况

Microsemi Libero使用技巧——查看芯片资源占用情况 前言 与MCU不同,FPGA的资源主要包括:逻辑资源,IO资源,Flash大小,PLL资源,SoC硬核处理器资源等,其中逻辑资源和IO资源是我们主要关心的,本篇文章将介绍,如何通过Microsemi Libero IDE来查看工程的详细资源占用情况。 A2F200M3F的资源 以Microsemi SmartFusion系列A2F2...

whik1194的博客 5697

常用的递归算法:dfs(深度优先搜索),记忆化搜索,分治

递归值函数调用自身; 一、DFS的介绍 概念很简单,但是还是得了解一下,下面介绍的内容是重点 1. 图的DFS (1)先看一下vector是怎么建图的? vector<int> vecMap[100010]; // n条边(这个结点所连接的结点) 邻接表建图 for (int i = 0; i < n; ++i) { int x, y; vecMap[x].push_back(y); vecMap[y].push_back(x); //若是无向图就加上这一句 } (2.

小郑在路上 1685

用 C# 快速构建一套可扩展的上位机框架(实战+源码思想)

本文介绍了一套基于C#的工业上位机开发框架设计方案。该框架通过模块化设计解决了上位机开发中的常见痛点,包括协议适配、通信管理、UI绑定等问题。核心架构采用分层设计,包含协议接口层、调度器层、通信抽象层和UI层,支持MVVM模式。框架提供了协议插件化扩展能力,通过JSON配置实现设备协议定义,同时封装了日志管理、异常处理等基础功能。该方案具有快速搭建、协议驱动、UI分离等特点,可显著提升上位机开发效率,适用于串口、TCP等多种通信场景,并能快速适配新设备协议。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 886

算法基础篇:(十八)从超时到秒过!DFS 优化指南:剪枝 + 记忆化让暴力搜索 “脱胎换骨”

摘要:深度优先搜索(DFS)虽能解决多种问题,但其暴力枚举特性常导致效率低下。本文系统介绍了DFS优化的核心方法:1)剪枝技术(排除等效冗余、可行性剪枝、最优性剪枝)通过提前终止无效路径减少搜索空间;2)记忆化搜索通过缓存重复子问题结果避免重复计算;3)搜索顺序优化优先探索高约束分支。文中结合组合枚举、数的划分、八皇后等经典问题,给出了C++实现代码和复杂度分析,并总结了"先判后搜"、"精准剪枝"等优化原则。这些技巧能将指数级复杂度降至多项式级,使DFS从"

2301_79248256的博客 1561

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【算法笔记】搜索算法优化:如何用记忆化与剪枝让DFS快100倍?

这里搜索的优化主要是对DFS的优化,我们前面也提到过的DFS搜索算法,是通过穷尽所有的可能来找到最优解或者统计合法解的个数。DFS其本质还是暴力枚举答案,当数据量比较大的时候容易TLE,因为其时间复杂度比较高。

weixin_74297512的博客 1457

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【笔试算法题】递归(dfs & 记忆化搜索 & 分治)

递归: 递归指函数调用自身。常用的递归算法有dfs(深度优先搜索)、记忆化搜索和分治。 一、dfs(深度优先搜索) 1.图的dfs /** * 深度优先搜索 * * @param node * @param set */ public void DFS(Node node, Set<Node> set) { if (node == null) { //当没有节点时,退出此次方法 return; } if (!set

indeedes的博客 1709

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法:DFS之记忆化搜索

本篇博客是关于 记忆化搜索 的练习题,每道题都超链接了力扣的网页,每道题都有详细的解答过程

一名还在努力学习技术的程序员的博客 961

DFS、回溯与记忆化搜索:算法刷题进阶实战解析

在算法学习与面试准备中,深度优先搜索(DFS)是遍历与搜索的基础思想,回溯法通过状态撤销实现全排列、组合等求解,记忆化搜索则用缓存解决重叠子问题,是动态规划的递归实现。三者层层递进,广泛应用于岛屿数量、N皇后、不同路径等经典题型。理解递归状态设计、分支枚举与剪枝优化,能显著提升解题效率。从暴力递归到带备忘录的搜索,再到动态规划,掌握这条路径有助于构建系统的算法思维。本文以实际刷题过程为例,剖析常见陷阱与排查技巧,帮助读者在LeetCode等平台高效突破搜索类题目,并自然过渡到动态规划与图论进阶。

weixin_30582943的博客 267

【算法打卡day35(2026-03-31 周二)】DFS专项训练2(今日算法:DFS & 记忆化搜索 & 回溯)

【算法打卡day35(2026-03-31 周二)】DFS专项训练2(今日算法:DFS & 记忆化搜索 & 回溯)

仟墨(郑龙浩)的博客 516

DFS记忆化搜索回溯:递归算法优化与状态管理实战

递归是算法工程中绕不开的核心思想,而深度优先搜索(DFS)正是递归最常见的落地形态。在解决路径查找、组合枚举、网格遍历等问题时,DFS能系统性地搜索所有可能解,但朴素递归往往面临指数级复杂度和重复计算的性能瓶颈。记忆化搜索通过缓存子问题结果,将重叠计算降为多项式时间,是动态规划的自顶向下实现方式;回溯则通过“选择—递归—撤销”的流程,在解空间树中穷举可行解,并依赖剪枝与状态恢复控制无效分支。从矩阵最长递增路径到组合总和、单词搜索,这些典型场景共同展示了递归、缓存与状态管理的协同价值。掌握DFS的遍历框架、记

weixin_31155097的博客 129

数据结构与算法 - DFS的剪枝优化:减少无效搜索的技巧

DFS剪枝优化:提升算法效率的关键技巧 本文系统介绍了深度优先搜索(DFS)中的五种剪枝优化技术,通过减少无效搜索路径显著提升算法性能。主要内容包括: 可行性剪枝:提前终止违反约束条件的分支(如组合总和问题中sum>target时终止) 最优性剪枝:当前路径代价不优于已知最优解时回溯(如TSP问题中的cost≥minCost判断) 搜索顺序优化:调整探索顺序优先尝试更可能失败的分支(如数独求解采用最少候选优先策略) 排除等效冗余:避免重复处理相同状态(通过排序或哈希去重) 记忆化搜索:存储已计算子问题

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

HDU 3811 Permutation 记忆化搜索 状态压缩 DP

题意: 求1-N的排列数但是有限定条件,AI,BI,该排列要满足第AI位为Bi。 算法: 1.裸的DFS 果断TLE。。时间复杂度为N! View Code #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include&...

weixin_30784945的博客 184

记忆化搜索算法:从DFS优化到动态规划

记忆化搜索(Memoization)是优化递归算法的重要技术,通过存储已计算结果避免重复计算,将时间复杂度从指数级降至多项式级。作为动态规划的基础思想,其核心在于识别重叠子问题并建立缓存机制。在算法竞赛和工程开发中,记忆化技术能显著提升DFS等搜索算法的性能,例如在矩阵路径搜索、斐波那契计算等场景可实现百倍加速。典型实现使用哈希表或数组存储状态-结果映射,结合剪枝策略可进一步优化空间复杂度。该技术在ACM竞赛和LeetCode高频题目(如329题最长递增路径)中有广泛应用,是算法工程师必须掌握的优化手段。

weixin_30516429的博客 193

蓝桥杯递增序列题解:从暴力DFS到记忆化搜索的算法实战

在算法设计与问题求解中,深度优先搜索(DFS)是一种基础且强大的遍历与搜索策略,它通过系统地枚举所有可能路径来探索问题的解空间。其核心原理在于递归或栈的应用,以深度优先的方式遍历状态树或图。DFS的技术价值在于其思维直接性,能作为复杂问题(如路径搜索、排列组合)的原始解决方案和验证原型,是理解动态规划等优化算法的重要基石。典型的应用场景包括迷宫求解、图的连通性判断以及各类组合优化问题。本文以蓝桥杯竞赛中经典的“矩阵递增路径”问题为例,详细阐述了如何运用暴力DFS思想进行问题拆解,并自然地引入**记忆化搜索(

weixin_29294395的博客 352

深度优先搜索:从全排列到记忆化搜索

本文系统分析了深度优先搜索(DFS)在算法竞赛中的三种核心形态及其适用场景。以0-1背包问题为例,首先剖析了排列型DFS(顺序敏感)的错误应用及其$O(M!)$的时间复杂度缺陷;然后介绍了组合型DFS(子集枚举)的正确思路,将复杂度降至$O(2^M)$;最后详细讲解了记忆化搜索的实现要点,强调状态转移的纯粹性和无后效性。文章指出,从暴力搜索到记忆化搜索的进化过程,本质是算法思维从"过程导向"向"状态导向"的转变,这也是算法学习者必须掌握的关键突破。

Runa880420的博客 568

搜索算法:回溯、BFS、DFS、记忆化、拓扑排序

本文系统梳理了回溯、BFS、DFS、记忆化搜索与拓扑排序五种算法形态,核心统一于“状态、转移、目标、走法”四要素。回溯通过深度优先枚举决策树,适用于子集、排列、组合等;BFS以层序扩展求最短路径,如腐烂橘子问题;DFS用于连通块搜索,关键在是否撤销访问;记忆化搜索通过缓存状态结果优化重复计算,适用于无环图上的最优路径;拓扑排序则基于入度处理依赖关系,判环并确定执行顺序。五类算法本质相同,差异仅在于走法与状态维护方式,掌握其共性可高效应对各类递归与图问题。

2403_87752060的博客 103
上一篇: 望丰展,使MD
下一篇: DFS 算法:全排列问题
Python_enjoy
博客等级 码龄4年 1201粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值