import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 递增路径的最大长度
* @param matrix int整型二维数组 描述矩阵的每个数
* @return int整型
*/
public int solve (int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0 ;
int rl = matrix.length ;
int cl = matrix[0].length ;
int res = 0 ;
int[][] dp = new int[rl][cl] ;//dp[i][j]表示map[i][j]开头的最长递增路径的长度
for(int i = 0 ; i < rl ; i ++) {
for(int j = 0 ; j < cl ; j ++) {
res = Math.max(res , dfs(matrix , dp , i , j)) ;
}
}
return res ;
}
//记忆化递归,dp[i][j]表示map[i][j]开头的最长递增路径的长度
//本函数的功能:找到以map[i][j]开头的最长递增路径的长度
public int dfs(int map[][] , int[][] dp , int i , int j) {
if(dp[i][j] != 0) return dp[i][j] ;
dp[i][j] ++ ;
int[][] deviation = {{-1 , 0} , {1 , 0} , {0 , -1} , {0 , 1}} ;//偏移:四个方向
for(int x = 0 ; x < 4 ; x ++) {//枚举i,j四周的点
int next_i = i + deviation[x][0] ;
int next_j = j + deviation[x][1] ;
//坐标合法且递增
if(next_i >= 0 && next_i < map.length && next_j >= 0 && next_j < map[0].length && map[next_i][next_j] > map[i][j]) {
dp[i][j] = Math.max(dp[i][j] , dfs(map , dp , next_i , next_j) + 1) ;//更新dp[i]
}
}
return dp[i][j] ;
}
}