当前位置: 首页 > article >正文

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

深度优先搜索DFS的进化之路从全排列到记忆化搜索在算法竞赛中搜索算法是解决问题的基础。然而面对不同类型的问题选用错误的 DFS 模型不仅会导致超时TLE还容易陷入逻辑混乱。本文将以经典的 0-1 背包问题如洛谷 P1048 [NOIP 2005 普及组] 采药为例剖析 DFS 的三种核心形态并总结从暴力搜索到记忆化搜索的进化过程。一、 陷阱排列型 DFS 路线搜索在初学 DFS 时最常接触的是迷宫寻路或全排列问题。这类问题的核心特征是顺序敏感——先采草药 A 再采草药 B与先采 B 再采 A 被视为两条不同的搜索路径。以下是一段典型的错误应用于背包问题的排列型 DFS 代码#includebits/stdc.husingnamespacestd;constintN110;inttmd[N],vl[N],vis[N];intT,M,value0,mv0;voiddfs(intpos,inttime,intv){if(timeT||vmv){valuemax(value,v-vl[pos]);// 试图通过扣除超时物品来回溯答案return;}// 致命的排列枚举for(inti1;iM;i){if(vis[i])continue;vvl[i];timetmd[i];vis[i]1;dfs(i,time,v);v-vl[i];time-tmd[i];vis[i]0;}}失败原因剖析时间复杂度爆炸这种写法试图枚举所有物品的拿取顺序时间复杂度高达O(M!)O(M!)O(M!)。对于M100M100M100的数据必定超时。背包问题只关心“拿了哪些物品的集合”完全不关心拿取的先后顺序。逻辑漏洞在这套逻辑下必须借助极其复杂的边界判断如超时后回退当前物品价值来维持全局最大值极易漏掉合法状态。二、 破局组合型 DFS 子集枚举意识到顺序不重要后DFS 的模型需要从“下一步选哪个物品”转变为“面对当前物品选还是不选”。这就切入了组合型子集型DFS。voiddfs(intpos,inttime,intv){if(posM)return;if(timeT)return;// 只要时间合法随时更新全局最大值valuemax(value,v);// 岔路1选择第 pos1 株草药dfs(pos1,timetmd[pos1],vvl[pos1]);// 岔路2不选第 pos1 株草药dfs(pos1,time,v);}特点去掉了for循环和vis数组每次递归仅产生两个分支。时间复杂度从阶乘级别降维到了指数级别O(2M)O(2^M)O(2M)。虽然逻辑已经完全正确但在M100M100M100时依然会超时因为存在大量重复计算的“残局”。三、 涅槃记忆化搜索 状态型 DFS为了消除组合型 DFS 中的重复计算必须引入“记事本”缓存数组。但在引入记忆化时初学者极易犯下一种将“自顶向下的全局变量”与“自底向上的状态返回值”混用的错误错误示范思维冲突的代码// 试图用全局变量配合 table导致逻辑崩盘intdfs(intpos,inttime){intv0;if(posM||timeT)returnv;// 致命错误查到状态后赋值给全局变量并返回 0if(table[pos][time]){valuetable[pos][time];returnv;}vdfs(pos1,time);if(timetmd[pos1]T){vmax(v,dfs(pos1,timetmd[pos1])vl[pos1]);}table[pos][time]v;returnv;}失败原因剖析记忆化的核心在于状态的无后效性和纯粹性。函数dfs(pos, time)必须是一个纯函数它只回答一个客观问题“站在第pos个物品前还剩time时间后续最多能拿多少价值”。一旦混入全局变量value并在读档时返回错误的0整个状态转移树就会断裂。最终 AC 代码纯粹的状态转移彻底抛弃全局最优解变量完全依赖返回值进行推导这是通向动态规划的最后一步。#includebits/stdc.husingnamespacestd;constintN110;inttmd[N],vl[N];intT,M;inttable[N][1200];// 记忆化数组intdfs(intpos,inttime){// 边界情况没有物品可选或时间耗尽后续收益为 0if(posM||timeT)return0;// 读档如果该状态已计算过直接返回答案if(table[pos][time]!-1){returntable[pos][time];}// 岔路1不选当前物品后续收益即为跳过该物品的收益intvdfs(pos1,time);// 岔路2选择当前物品前提是时间足够if(timetmd[pos1]T){// 当前物品价值 消耗时间后的后续最大收益vmax(v,dfs(pos1,timetmd[pos1])vl[pos1]);}// 存档并返回table[pos][time]v;returnv;}intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cinTM;for(inti1;iM;i){cintmd[i]vl[i];}// 必须将记忆化数组初始化为 -1因为真实最高价值可能为 0memset(table,-1,sizeof(table));coutdfs(0,0)\n;return0;}四、 总结考场上的 DFS 类型选择指南在面对搜索问题时明确 DFS 的类型是避免方向性错误的关键排列型 / 路线型 DFS适用场景走迷宫寻路、TSP旅行商问题、求解全排列。实现特征返回值为void依赖for循环展开搜索树必须使用标记数组vis进行状态隔离与回溯。常伴随全局变量记录结果。代价O(N!)O(N!)O(N!)规模极其受限。组合型 / 子集型 DFS适用场景挑选队员、子集求和、物品不受顺序影响的挑选。实现特征无for循环针对每个元素直接裂变为“选”与“不选”两个分支。通过参数传递当前累积状态。代价O(2N)O(2^N)O(2N)指数级适用于N≤20N \le 20N≤20的小数据。状态型 DFS / 记忆化搜索适用场景背包问题、存在大量重叠子问题、求极值或方案数本质为动态规划的递归实现。实现特征返回值必须为具体数值如int或long long严禁使用全局变量记录当前累积结果。函数首部查表尾部存表状态转移依靠max、min或四则运算完成。代价仅计算独立状态的总数时间复杂度断崖式下降。从迷恋for循环与回溯到掌握“选与不选”的二叉分支再到彻底剥离全局状态实现记忆化这是每一个算法学习者破茧成蝶的必经之路。

相关文章:

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

深度优先搜索(DFS)的进化之路:从全排列到记忆化搜索 在算法竞赛中,搜索算法是解决问题的基础。然而,面对不同类型的问题,选用错误的 DFS 模型不仅会导致超时(TLE),还容易…...

技术深潜:从向量检索到语义对齐——解析天津市南开区天才群策科技有限责任公司的GEO工程化实践

技术前言:当企业营销遭遇模型黑盒 在CSDN的技术社区里,关于GEO的讨论早已从“是什么”转向了“怎么做”。随着各大AI平台算法的快速迭代,传统的SEO技术栈已全面失效。企业面临的核心矛盾在于:大模型的知识更新是非线性的&#xff…...

D3DCompiler_47.dll未被指定在Windows运行的问题解决办法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

一文读懂OpenClaw!开源、可自托管的个人Agent平台

OpenClaw 是 2026 年备受关注的开源 AI Agent 平台,它并非普通的聊天 AI,而是 AI 智能 体理论的成熟工程化实践,不仅能聊天,更能帮你执行具体处理任务。想要用好这一工具,首先要厘清其底层的基础逻辑。 OpenClaw基础概…...

vue2和vue3使用less和scss

文章目录Vue 2 中使用 Less 和 SCSS一、安装依赖二、配置 vue.config.js三、在 .vue 文件中使用Vue 3 中使用 Less 和 SCSS一、安装依赖二、配置 vite.config.js三、在 .vue 文件中使用Vue 2和Vue 3使用差异样式穿透less、scss语法1、变量2、运算3、注释4、嵌套5、混入(Mixin)6…...

3.29不见不散

...

超越 Transformer 的架构前瞻

第六章:未来——超越 Transformer 的架构前瞻Transformer 的成功令人瞩目,但在工程和科学的世界里,没有任何架构是完美的。Transformer 有它的阿喀琉斯之踵,全球顶尖实验室正在积极探索下一代架构。这一章我们来剖析 Transformer …...

面试官最爱问的设计题:动态支付系统设计(策略模式 + 工厂模式 + Spring自动注册)

在 Java 面试中,有一道 非常经典的面向对象设计题:如何设计一个 支持多种支付方式的支付系统?例如:支付宝微信银行卡Apple Pay未来可能新增更多支付方式很多面试者第一反应就是写 if-else,但这其实是一个 典型的设计模…...

部署RHCSA9.7、并完成优化

一、建立虚拟机 1、初步建立 (1)点击创新的虚拟机 (2)点击自定义----下一步 (3)点击稍后安装操作系统----下一步 (4)点击Linux(L)----版本选择(…...

分享一款高颜值强大的uniapp组件库-图鸟组件库

图鸟UI是一套基于uni-app的组件库,提供了丰富的UI组件和完整的页面模板,可以帮你快速搭建小程序、H5或App。下面整理了官方模板和社区资源的入口,方便你直接选用。 🎨 官方模板系列 图鸟官方提供了多种场景的完整模板&#xff0…...

深度探讨:从 OpenClaw 爆火,看 AI Agent 的真相与程序员的未来

导语: 近期,以 OpenClaw 为代表的自主智能体(Autonomous Agent)火爆技术圈。这些宣称能“完全接管电脑、自主写代码”的 AI 到底有多神?在狂热的炒作背后,技术落地的真相是什么?AI 真的要干掉程…...

AI博主实测|2026最新PPT工具合集,覆盖全场景,告别熬夜手搓

一、引言作为常年和PPT打交道的AI博主,每天都会收到粉丝提问:“做PPT用什么工具高效?”“AI能帮我快速做PPT吗?”“新手零基础,哪款工具最容易上手?”其实PPT工具没有“最好”,只有“最适配”—…...

原生Windows安装OpenClaw

前言 根据OpenClaw官方文档,Windows下安装其实是推荐WSL2,但我的电脑上没有提前装Linux虚拟机,又只是想先快速体验一下OpenClaw,因此就原生Windows安装了。 部署前准备 官方文档中,有几种安装方式。 方式一 通过在W…...

02-Agent 智能体开发实战指南(二):工具调用系统

Agent 智能体开发实战指南(二):工具调用系统深度解析 系列导读:这是《Agent 智能体开发实战指南》系列的第二篇,将深入讲解 Agent 的工具调用系统,包括tool 装饰器原理、工具设计原则、多工具协作等核心内容…...

AI大模型课程|非计算机专业转行人工智能,好就业吗?非常详细收藏我这一篇就够了

很多就业者在看到人工智能领域发展的很好,意识觉醒的人想进入这个行业里面得到一些新兴行业的红利,想转行却担心自己的经历或者是专业被卡,犹豫不决,今天就来和大家聊一聊这个话题,看看能不能解除你的疑惑。 01写在前面…...

2026春招AI人才暴涨12倍!高薪缺人,企业招聘“去初级化”,脉脉洞察求职新趋势!

近日,职场社区平台脉脉发布《社交求职——2026年1-2月中高端人才求职招聘洞察》(以下简称《洞察》)。《洞察》显示,2026年1-2月,招聘市场整体回暖。新经济行业岗位量增长12.77%。AI人才争夺成招聘主战场,岗…...

OpenClaw深度解析:AI Agent运作机制全拆解,揭秘智能边界与安全风险!

本课以 OpenClaw 为具体案例,系统拆解 AI Agent 的完整运作机制。核心逻辑链为:LLM文字接龙本质 → System Prompt驱动的身份认知构建 → Tool Call工具链执行(Read/Write/exec/TTS/ASR递归调用)→ Sub-agent层级外包与Context En…...

Coursera 6 大 AI 爆款课深度评测!告别理论堆砌,初级开发者也能秒懂选课攻略,简历瞬间加分!

市面上 AI 课程一大堆,但要么太理论,要么太基础。本文对 Coursera 上 6 门优质 AI 课程进行了评测,结合国内初级开发者视角,帮你看懂各课程适合什么人、侧重点是什么,以及如何按自己的起点与目标做出选课决策。导语 想…...

ebmap Tour 智慧节目时间表功能预览

ebmap Tour 最近新增了节目时间表功能,为景区 / 园区打造实时化、场景化的演艺活动管理与展示体系,让游客清晰掌握节目动态、合理规划游览路线,同时帮助运营方高效编排、精准触达游客,提升景区服务体验与活动曝光。安装扩展&#…...

约瑟夫环(代码+公式推导)

题目描述𝑛个人的编号是 1 ~ 𝑛,如果他们依编号按顺时针排成一个圆圈,从编号是 1 的人开始顺时针报数。(报数是从 1 报起)当报到 𝑘的时候,这个人就退出游戏圈。下一个人重新从 1 开…...

图解C语言侵入式双向循环链表与 container_of 宏底层原理

一、侵入式链表 在了解侵入式链表之前,先回顾之前的非侵入式链表,形式如下: struct Node {int data; // 数据struct Node* next; };在非侵入式链表的这种设计中,拿到一个 Node,顺便也就拿到了它的 data。 …...

java从头开始-苍穹外卖-day11-数据统计与展示

营业额统计用户统计订单统计销量排名top10这个其实要多表联查,菜品是在订单详情表,但是这个表没有订单完成状态,因此需要多表连查...

别让Service层“越界”:为何Java中Service层不该直接返回Result对象?

别让Service层“越界”:为何Java中Service层不该直接返回Result对象? 引入:一次代码审查引发的思考 昨天在进行代码审查的时候,我发现同事在 Service 层直接返回了 Result 对象。当时我就指出了这个问题,可同事一脸疑惑…...

基于Spring Boot的校园二手物品置换系统设计与实践

第一章:系统设计目标与需求拆解 在高校倡导绿色低碳理念与学生闲置物品处理需求增长的背景下,基于Spring Boot的校园二手物品置换系统,核心目标是构建“以物换物”的非货币交易平台,解决传统校园二手交易中“价格博弈繁琐、闲置物…...

基于SpringBoot+Vue的旅游信息咨询网站

第一章:网站设计背景与核心定位 在旅游消费升级的趋势下,用户对旅游信息的需求从“基础查询”转向“精准化、个性化、一站式”服务,传统旅游信息平台存在信息碎片化、更新滞后、互动性弱等问题——用户需在多个平台切换查询景点、住宿、交通信…...

大学C语言搜题app推荐,助你从小白变编程大牛

不少自学C语言的同学都碰到过这般困境,看书之际觉着自己懂了,然而一敲代码便两眼一抹黑,碰到报错也不清楚如何解决。实际上,要想切实掌握这门底层语言,仅仅啃书本远远不足够,借助手机上的工具随时开展练习、…...

C语言特点及应用领域介绍,面向过程语言的相关知识

拥有50年历史的老牌编程语言C语言,直至如今在嵌入式开发领域依旧稳稳占据着霸主位置,每年毕业的程序员数量成千上万,然而真正能够把C语言运用到关键之处的却并不多。它具备简单直接的面向过程特性,在资源受到限制的单片机上面&…...

MCP、RAG与AI智能体对比图文笔记:收藏这份入门指南,轻松掌握大模型核心技术方向!

核心概念:各司其职的技术方向当前AI领域最火的三个概念(MCP、RAG、AI智能体),本质上解决的是不同层面的问题,并非互斥竞争关系。以下是它们的定位差异:技术方向核心能力解决的核心问题MCP定义LLM如何使用外…...

技术深度:模型预测控制(MPC)储能控制策略与多目标哈里斯鹰(MOHHO)算法储能容量配置研究

模型预测控制(MPC)储能控制策略 多目标哈里斯鹰(MOHHO)算法储能容量配置 matlab 研究内容:控制策略为双层控制模型,上层储能补偿风电预测误差,下层储能利用MPC平抑风电功率波动。 配置模型嵌入了上述控制策略&#xf…...

Docker 核心知识点

一、Docker 是什么Docker 把应用 依赖 环境一起打包,放到一个轻量、隔离、可移植的容器里,在哪都能跑。二、3 个核心概念1. 镜像(Image)- 只读模板 - 相当于「安装包」「系统盘」- 例:nginx、centos、tomcat2. 容器…...