深度优先遍历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);}
}