给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
动态规划-记忆化搜索
对每个点周围四个点中比它小的点进行搜索 其中最长路径+1为当前点最长路径
对搜索过的点用二维数组记录
class Solution {
int[][] dp;
int[][] flag;
public int longestIncreasingPath(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
if(matrix == null || m == 0 || n == 0)
return 0;
dp = new int[m][n];
flag = new int[m][n];
int ans = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
dp[i][j] = search(matrix, i, j);
ans = Math.max(ans, dp[i][j]);
}
}
return ans;
}
int[] cx = {0, 1, 0, -1};
int[] cy = {1, 0, -1, 0};
private int search(int[][] matrix, int x, int y){
if(flag[x][y] == 1){
return dp[x][y];
}
int ans = 1;
for(int i = 0; i < 4; i++){
int newx = x + cx[i];
int newy = y + cy[i];
if(!isValid(matrix, newx, newy))
continue;
if(matrix[newx][newy] < matrix[x][y])
ans = Math.max(ans, search(matrix, newx, newy) + 1);
}
flag[x][y] = 1;
dp[x][y] = ans;
return ans;
}
private boolean isValid(int[][] matrix, int x, int y){
int m = matrix.length;
int n = matrix[0].length;
if(x < 0 || y < 0 || x >= m || y >= n)
return false;
return true;
}
}