思路: 动态规划,当前的长度算1,化繁为简,递归下去
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)
来源:力扣(LeetCode) 链接:leetcode.cn/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int longestIncreasingPath(int[][] matrix) {
int ans = 0;
int N = matrix.length;
int M = matrix[0].length;
int[][] dp = new int[N][M];
for(int i = 0; i< N; i++) {
for(int j = 0; j<M; j++) {
ans = Math.max(ans, process(matrix,i,j,dp));
}
}
return ans;
}
// 从m[i][j]开始走, 走出来的最长递增链, 返回
public static int process(int[][] m,int i, int j,int[][] dp) {
if(dp[i][j] != 0) {
return dp[i][j];
};
// if(i < 0 || i == m.length || j < 0 || j == m[0].length) {
// return 0;
// }
// (i,j)不越界的情况下
int up = i > 0 && m[i][j] < m[i - 1][j] ? process(m,i-1,j,dp):0;
int down = i < (m.length - 1) && m[i][j] < m[i+1][j] ? process(m,i+1,j,dp) : 0;
int left = j > 0 && m[i][j] < m[i][j - 1] ? process(m,i,j -1,dp): 0;
int right = j < (m[0].length - 1) && m[i][j] < m[i][j+1] ? process(m,i,j+1,dp) : 0;
int ans = Math.max(Math.max(up,down),Math.max(left,right)) + 1;
dp[i][j] = ans;
return ans;
}
}