回溯:找出最大路径的递增路径
题目https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2?tpId=295&tqId=1076860&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
首先想到的就是回溯,类似于迷宫问题,但是还是想不出来怎么写,有待加强。
定义一个max,找出n、m。开始循环遍历整个矩阵。循环体就是dfs深搜方法体,但是需要对每次结果记录最大的max值最后返回。
在深搜方法中首先加入数组mar,下标i、j,还有上一次遍历到的值pre。
首先深搜结束条件,如果当前遍历到的值小于pre,那么直接返回,也就是这条路行不通。
定义max,每次都需要刷新,然后上下左右开始遍历,但是pre的值要注意,当前遍历的要赋值给pre当做下一次的判断条件即可,最后返回max。
package com.kuang.reflection; import java.util.*; public class Test07 { public int solve (int[][] matrix) { int max = 0; int n = matrix.length;; int m = matrix[0].length; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { max = Math.max(max,dfs(matrix,i,j,-1)); } } return max; } public int dfs(int[][] matrix,int i,int j,int pre){ if(matrix[i][j] <= pre) { return 0; } int max = 0; if(i > 0){ max = Math.max(max, dfs(matrix, i - 1, j, matrix[i][j])); } if(j > 0){ max = Math.max(max, dfs(matrix, i, j - 1, matrix[i][j])); } if(i < matrix.length - 1){ max = Math.max(max, dfs(matrix, i + 1, j, matrix[i][j])); } if(j < matrix[i].length - 1){ max = Math.max(max, dfs(matrix, i, j + 1, matrix[i][j])); } return max + 1; } }