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

深度优先遍历dfs(模板)

1.概念

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。该算法沿着树的深度遍历节点,尽可能深地搜索树的分支。当节点的所有边都已被探寻过,或在搜索过程中节点不满足条件时,搜索将回溯到发现该节点的边的起始节点。这个过程会一直进行,直到所有节点都被访问为止。DFS属于盲目搜索,最糟糕的情况下算法时间复杂度为O(n!)

DFS的基本思想:为了求得问题的解,先选择某一种可能情况向前探索;在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择(已经选择过的不能再选了),继续向前探索;如此反复进行,直至得到解或证明无解。

注:DFS遍历序列不止上面一种,在源点Vo到下一个结点可以是 V1,V3,V4 ,具体是哪一个由你写的代码决定。

ok,通过上面的文字和图,大致可以了解什么是dfs,那么下面用dfs如何来解决这道题呢?(你可以先尝试一下)

2.例题:滑雪_牛客题霸_牛客网

1.算法原理(dfs)

2.如何优化 (记忆化搜索)

你会发现对于2->1,4->1 ; 这里有重复,如果我们把2往后的最大长度记入下来,是不是当第二次到2位置时便可直接返回这个值了。

所以在如下代码每次向上返回值之前,先把这个值记入下来,方便下一次使用。

3.代码

import java.util.*;public class Main {public static int[] dx = new int[] {0, 0, -1, 1};public static int[] dy = new int[] {1, -1, 0, 0};public static int[][] arr;public static boolean[][] vis;public static int n;public static int m;// 记忆话搜索加一步(注释部分代码)// public static int[][] memory;// dfs 核心代码public static int dfs(int i, int j) {// if(memory[i][j] != 0){//     return memory[i][j];// }int count = 1;for (int k = 0; k < 4; k++) {int xx = i + dx[k];int yy = j + dy[k];if (xx >= 0 && xx < n && yy >= 0 && yy < m && vis[xx][yy] == false && arr[i][j] > arr[xx][yy]) {vis[xx][yy] = true;count = Math.max(dfs(xx, yy)  + 1,count);vis[xx][yy] = false;}}// memory[i][j] = count;return count;}public static void main(String[] args) {// 处理输入 和 初始化Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();arr = new int[n][m];vis = new boolean[n][m];// memory = new int[n][m];int ansMaxCount = 0;for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) arr[i][j] = sc.nextInt();// 遍历每一个位置作为起点for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {vis[i][j] = true;ansMaxCount = Math.max(dfs(i, j),ansMaxCount);vis[i][j] = false;}}System.out.print(ansMaxCount);}
}
http://www.dtcms.com/a/338244.html

相关文章:

  • VS Code Copilot 完整使用教程(含图解)
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • 图论:Floyd算法
  • 从数学原理推导的角度介绍大语言MOE架构的本质
  • Linux系统WireShark抓取本地网卡报文
  • uv 现代化的虚拟环境管理工具
  • 量化线性层,将原始的fp16/bf16权重加载到Linear8bitLt模块中,调用int8_module.to(“cuda”)量化 (44)
  • 视频讲解:CatBoost、梯度提升 (XGBoost、LightGBM)对心理健康数据、交通流量及股票价格预测研究
  • Dubbo 的SPI
  • 深入解析RabbitMQ与AMQP-CPP:从原理到实战应用
  • IDEA 配置终端提示符样式,通过脚本方式
  • IntelliJ IDEA 开发配置教程
  • WPF---数据模版
  • 监督学习(Supervised Learning)和 无监督学习(Unsupervised Learning)详解
  • PCIe ASPM详解
  • 14.Linux线程(2)线程同步、线程安全、线程与fork
  • 【秋招笔试】2025.08.17大疆秋招机考第一套
  • plantsimulation知识点25.8.18-从一个RGV到另一台RGV,工件长度和宽度方向互换
  • pytest测试框架之基本用法
  • GPT-5之后:当大模型更新不再是唯一焦点
  • 本地搭建dify+deepseek智能体
  • 【unitrix数间混合计算】3.1 零标记trait(zero.rs)
  • 【最后203篇系列】033 Mongo副本集修复过程
  • Maven resources资源配置详解
  • 小程序被爬虫攻击,使用waf能防护吗?
  • Vision Master的C#脚本与opencv联合编程
  • 【opencv-Python学习笔记(7):图像平滑处理】
  • 【图像算法 - 17】慧眼识“果”:基于深度学习与OpenCV的苹果智能检测系统(附完整代码)
  • sqli-labs通关笔记-第54关 GET字符型注入(单引号闭合 限制10次探测机会)
  • 英特尔公司Darren Pulsipher 博士:以架构之力推动政府数字化转型