当前位置: 首页 > 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.lryc.cn/news/624574.html

相关文章:

  • 具身智能2硬件架构(人形机器人)摘自Openloong社区
  • 数据结构:查找表
  • 宏观认识 Unitree LiDAR L1 及其在自动驾驶中的应用
  • 【opencv-Python学习日记(7):图像平滑处理】
  • 阿里云odps和dataworks的区别
  • Poisson分布:稀有事件建模的理论基石与演进
  • 前端纯JS实现手绘地图 地图导引
  • YAML 语法结构速查表(完整版)
  • 【tips】unsafe-eval线上页面突然空白
  • Lucene 8.5.0 的 `.pos` 文件**逻辑结构**
  • 永磁同步电机控制算法--转速环电流环超螺旋滑模控制器STASMC
  • 大数据毕业设计选题推荐:基于Hadoop+Spark的城镇居民食品消费分析系统源码
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • 将 iPhone 联系人转移到 Infinix 的完整指南
  • Zephyr下ESP32S3开发环境搭建(Linux篇)
  • 【Python语法基础学习笔记】常量变量运算符函数
  • 分布式系统的“不可能三角”:CAP定理深度解析
  • flask——4:请求与响应
  • 敏感数据加密平台设计实战:如何为你的系统打造安全“保险柜”
  • 实战演练:通过API获取商品详情并展示
  • pytest的前置与后置
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • c++26新功能—可观测检查点
  • 晨控CK-GW08S与欧姆龙PLC配置Ethernet/IP通讯连接手册
  • PHP现代化全栈开发:微前端架构与模块化实践
  • 深入解析RabbitMQ与AMQP-CPP:从原理到实战应用
  • Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成
  • 【VUE】Vue3 绘制 3D 蓝图利器 Grid Plan
  • 蛇形方阵构造
  • k8sday10服务发现(1/2)