回溯:找出最大路径的递增路径
题目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;
}
}
