class Solution {
int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int m, n;
public int longestIncreasingPath(int[][] matrix) {
if (matrix == null || matrix.length == 0) return 0;
m = matrix.length;
n = matrix[0].length;
int ans = 0;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans = Math.max(ans, dfs(i, j, matrix, dp));
}
}
return ans;
}
private int dfs(int r, int c, int[][] matrix, int[][] dp) {
if (dp[r][c] > 0) return dp[r][c];
int max = 1;
for (int[] d : dirs) {
int nextR = r + d[0];
int nextC = c + d[1];
if (nextR >= 0 && nextR < m && nextC >= 0 && nextC < n && matrix[nextR][nextC] > matrix[r][c]) {
max = Math.max(max, 1 + dfs(nextR, nextC, matrix, dp));
}
}
dp[r][c] = max;
return dp[r][c];
}
}