递归------深度优先搜索

深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。它从一个顶点开始,尽可能深地搜索树的分支。深度优先搜索沿着一条路径深入,直到无法继续为止,然后回溯并尝试其他路径。这种搜索策略可以系统地探索一个图的所有顶点和边。

深度优先搜索的主要特点包括:

  1. 递归实现:深度优先搜索通常使用递归实现,其中每个节点会递归地访问其所有未访问过的邻居节点。

  2. 栈的使用:在非递归实现中,可以使用栈(后进先出的数据结构)来模拟递归过程。

  3. 路径探索:深度优先搜索会沿着一条路径深入探索,直到到达一个没有未访问邻居的节点,然后回溯。

  4. 回溯:当搜索到达一个死胡同(即没有更多的节点可以访问)时,算法会回溯到上一个节点,并尝试另一条路径。

  5. 图的遍历:在图的遍历中,深度优先搜索可以用来检测环,或者确定图是否是连通的。

  6. 时间复杂度:对于有V个顶点和E条边的图,深度优先搜索的时间复杂度通常是O(V+E)。

  7. 应用场景:深度优先搜索常用于解决迷宫问题、路径寻找、拓扑排序、检测图中的环等问题。

深度优先搜索的伪代码如下:

DFS(graph, vertex, visited):visited[vertex] = truefor each neighbor of vertex:if visited[neighbor] == false:DFS(graph, neighbor, visited)

在实际应用中,深度优先搜索可以用于各种图和树结构的问题,是计算机科学中一个非常重要的算法

滑雪场
 
 

image.png


 

题目描述

这是一道经典的二维矩阵搜索问题。题目描述了一个滑雪场景:

  • 给定一个二维矩阵,每个位置表示滑雪场的海拔高度

  • 滑雪者可以从任意位置开始滑雪

  • 滑雪者只能从高处往低处滑

  • 每次可以向上下左右四个方向滑动

  • 要求找出最长的滑雪路径长度

示例说明

以代码中的测试用例为例:

test_heights = [[1,  2,  3,  4,  5],[16, 17, 18, 19, 6],[15, 24, 25, 20, 7],[14, 23, 22, 21, 8],[13, 12, 11, 10, 9]
]

在这个例子中:

  • 最长的滑雪路径长度是25

  • 一条可能的最长路径是:25 → 24 → 23 → 22 → 21 → 20 → 19 → 18 → 17 → 16 → 15 → 14 → 13 → 12 → 11 → 10 → 9 → 8 → 7 → 6 → 5 → 4 → 3 → 2 → 1

问题特点

  • 路径特性:

  • 路径必须是严格下降的(每一步都必须比上一步的高度低)

  • 路径长度包含起点和终点

  • 搜索特性:

  • 需要尝试从每个点出发

  • 每个点都可能是最长路径的起点

  • 具有重叠子问题的特点

  • 解题难点:

  • 如何避免重复计算

  • 如何处理边界情况

  • 如何高效地搜索所有可能的路径

解题思路

  • 使用DFS:

  • 采用深度优先搜索遍历所有可能的路径

  • 从每个点开始尝试四个方向的滑行

  • 记忆化优化:

  • 使用memo数组记录已经计算过的结果

  • 避免重复计算相同的子问题

  • 边界处理:

  • 检查数组边界

  • 检查高度条件

  • 处理无效输入

实现代码

def longestSkiPath(heights):if not heights or not heights[0]:return 0rows = len(heights)cols = len(heights[0])# 记忆化数组,memo[i][j] 表示从点(i,j)开始能滑行的最长路径长度memo = [[-1] * cols for _ in range(rows)]# 四个方向:上、下、左、右directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]def dfs(row, col):# 如果已经计算过,直接返回if memo[row][col] != -1:return memo[row][col]# 初始长度为1(当前点)max_length = 1# 尝试四个方向for dx, dy in directions:new_row, new_col = row + dx, col + dy# 检查新位置是否有效且高度更低if (0 <= new_row < rows and 0 <= new_col < cols and heights[new_row][new_col] < heights[row][col]):# 递归计算从新位置开始的最长路径current_length = 1 + dfs(new_row, new_col)max_length = max(max_length, current_length)# 记录结果memo[row][col] = max_lengthreturn max_length# 从每个点开始尝试,找到最长路径result = 0for i in range(rows):for j in range(cols):result = max(result, dfs(i, j))return result# 测试代码
if __name__ == "__main__":# 测试用例test_heights = [[1, 2, 3, 4, 5],[16, 17, 18, 19, 6],[15, 24, 25, 20, 7],[14, 23, 22, 21, 8],[13, 12, 11, 10, 9]]print(longestSkiPath(test_heights))  # 应该输出 25 

从点(2,2)(值为25)开始的搜索过程:

  • 检查四周:

  • 上:18 < 25 ✓

  • 下:22 < 25 ✓

  • 左:24 < 25 ✓

  • 右:20 < 25 ✓

  • 递归搜索每个可行方向,并选择最长的路径:

  • 从18继续搜索

  • 从22继续搜索

  • 从24继续搜索

  • 从20继续搜索

  • 使用记忆化数组(memo)避免重复计算:

  • 当某个点被计算过后,其结果会被存储在memo中

  • 下次遇到相同的点时直接返回存储的结果

5. 时间复杂度

  • 没有记忆化:O(4^(mn)),因为每个点都可能往4个方向扩展

  • 使用记忆化后:O(mn),因为每个点最多被计算一次

    6. 空间复杂度

  • O(mn),主要是记忆化数组的空间

这个算法通过记忆化搜索有效地避免了重复计算,大大提高了效率。对于示例输入,最终会找到长度为25的最长路径。
 

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

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

相关文章

蓝桥杯c++算法学习【5】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! &#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片&#xff1a; 【问题描述】 小蓝有很多数字卡片&#xff0c;每张卡片上都…

相机网卡开启巨型帧和关闭节能模式方法

2022 年 8 月 2 日 Tank 阅读次数&#xff08;ip/1年&#xff09;: 26,796 win10为例子 首先在开始菜单搜索&#xff1a;网络连接 对想要设置的网络右键&#xff1a;属性 点 配置 高级里面找到这三个选项&#xff0c;参考下图设置&#xff0c;螃蟹网卡建议关掉所有节能有关的…

Windows server2016设置多用户界面——保姆级教程

在 Windows Server 2016 服务器中&#xff0c;通常默认情况下能够支持两个用户进行远程登录。而通过在服务器上安装远程桌面服务中的远程桌面会话主机和远程桌面授权&#xff0c;并对其进行相应配置&#xff0c;便可以实现多用户远程登录。 远程桌面服务是一种由若干角色服务所…

第一个autogen与docker项目

前提条件&#xff1a;在windows上安装docker 代码如下&#xff1a; import os import autogen from autogen import AssistantAgent, UserProxyAgentllm_config {"config_list": [{"model": "GLM-4-Plus","api_key": "your api…

后端开发详细学习框架与路线

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端开发 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 为帮助你合理安排时间&#xff0c;以下是结合上述学习内容的阶段划分与时间分配建议。时间安排灵活&a…

【Isaac Sim】相关问题汇总

目录 一、安装点击Install时报错二、启动时报 Failed to create any GPU devices三、加载Isaac Sim自带模型或示例时报 Isaac Sim is not responding 一、安装点击Install时报错 报错&#xff1a; request to https://asset.launcher.omniverse.nvidia.com/… failed, reason:…

社团管理智能化:SpringBoot技术

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【C++】继承(inheritance)

引入 假设我们有一个动物类 class Animal { public:int age;void eat() {std::cout << "吃东西&#xff01;" << std::endl;} };又想写一个狗类&#xff0c;它也有年龄&#xff0c;也会吃&#xff0c;除此之外还有种类 class Dog { public:const char…

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)

Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案https://blog.csdn.net/shijianduan1/article/details/133386281 某业务配置表&#xff0c;按配置的时间区间及组织层级取方案&#xff0c;形成报表展示出所有部门方案的取值&#xff1b; 例如&#xff0…

电子应用设计方案-19:智能云饭锅系统方案设计

智能云饭锅系统方案设计 一、系统概述 本智能云饭锅系统旨在提供便捷、个性化和智能化的烹饪体验&#xff0c;结合云服务实现远程控制、食谱推荐和烹饪数据管理等功能。 二、系统组成 1. 锅体 - 采用高品质的不粘涂层内胆&#xff0c;确保米饭受热均匀且易于清洁。 - 具备良好…

镁光MT25QU01GXXX norflash调试笔记

目录 前言一、芯片概述二、数据手册解释1. 数据手册获取2.内容概括 三、几个操作的代码1.复位芯片操作2.读取芯片ID3.擦除芯片扇区4.向芯片存入数据5.读取存储的数据6.其它操作函数 前言 本笔记总结如何使用MCU对nor flash进行数据存储&#xff0c;包括芯片基本介绍&#xff0…

Qt界面设计时使各控件依据窗口缩放进行栅格布局的方法

图1 最终效果 想要达成上述图片的布局效果&#xff0c;具体操作如下&#xff1a; 新建一窗体&#xff1a; 所需控件如下&#xff1a; Table View控件一个&#xff1b; Group Box控件一个&#xff1b; Push Button控件2个&#xff1b; Horiziontal Spacer控件2个&#xf…

【Git】:Git基本操作

目录 创建、配置本地仓库 创建本地仓库 配置本地仓库 认识工作区、暂存区、版本库 修改文件 版本回退 撤销修改 删除文件 创建、配置本地仓库 创建本地仓库 我们通常可以通过以下两种方式之一获取 Git 存储库&#xff1a; 自己在本地目录创建一个本地仓库 从其它服务…

CANDENCE: 绘制好的封装元件 刷新(Refresh) 和 替换 (Replace)焊盘

绘制好的封装元件 刷新(Refresh) 和 替换 &#xff08;Replace&#xff09;焊盘 一、刷新(Refresh) 1、以下面这个bga484封装的元件为例 2、打开bga的焊盘文件 3、我们对上面这个焊盘稍加修改&#xff0c;如下&#xff0c;然后保存 4、在封装编辑页面&#xff0c;如下操作 5…

HarmonyOS:使用ArkWeb构建页面

一、简介 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 二、…

修改一下达梦disql 提示符

经常用disql的有时某些信息希望提示一下&#xff0c;默认的只显示SQL> 为了方便使用&#xff0c;可以在 glogin.sql 中增加些内容。 vi $DM_HOME/bin/disql_conf/glogin.sql增加以下几行 set time on set lineshow offcol global_name new_value global_name SELECT ins…

跨境出海安全:如何防止PayPal账户被风控?

今天咱们聊聊那些让人头疼的事儿——PayPal账户被风控。不少跨境电商商家反馈&#xff0c;我们只是想要安安静静地在网上做个小生意&#xff0c;结果不知道为什么&#xff0c;莫名其妙账户就被冻结了。 但其实每个封禁都是有原因的&#xff0c;今天就来给大家分享分享可能的原…

如何读论文【论文精读·1】

第一遍题目 摘要 结论 方法 实验 是不是适合自己看看自己适不适合这篇文章。&#xff08;花时最少&#xff0c;做海选&#xff09; 不需要懂太具体的公式。这一遍阅读之后&#xff0c;你需要再继续思考一下这篇论文的质量以及和自己研究方向的契合程度&#xff0c;决定一下自己…

【模块一】kubernetes容器编排进阶实战之pod生命周期、探针简介、类型及示例

kubernetes pod生命周期、探针简介、类型及示例 kubernetes pod生命周期 pod的生命周期(pod lifecycle)&#xff0c;从pod start时候可以配置postStart检测&#xff0c;运行过程中可以配置livenessProbe和 readinessProbe,最后在 stop前可以配置preStop操作 探针简介 探针是由…

医学AI公开课·第一期|Machine LearningTransformers in Med AI

小罗碎碎念 从这周开始&#xff0c;我计划每个周末录一个视频&#xff0c;分享一些医学人工智能领域的进展。 作为第一期视频&#xff0c;我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频&#xff0c;总共做了24页PPT&#xff08;三部分内容&…