import java.util.*;
public class Solution {
private int ans = 0;
public int solve(int[][] matrix) {
if (matrix == null || matrix.length == 0) return 0;
int row = matrix.length;
int col = matrix[0].length;
int[][] memo = new int[row][col];
for (int i = 0; i <row; i++) {
for (int j = 0; j <col; j++) {
dfs(matrix, i, j, 0, memo);
}
}
return ans;
}
private int dfs(int[][] matrix, int i, int j, int length, int[][] memo) {
if (memo[i][j] != 0) {
ans = Math.max(ans, length + memo[i][j]);
return memo[i][j];
}
int maxPathFromHere = 1;
if (i >= 1 && matrix[i - 1][j] > matrix[i][j])
maxPathFromHere = Math.max(maxPathFromHere, dfs(matrix, i - 1, j, 0, memo) + 1);
if (i < matrix.length - 1 && matrix[i + 1][j] > matrix[i][j])
maxPathFromHere = Math.max(maxPathFromHere, dfs(matrix, i + 1, j, 0, memo) + 1);
if (j >= 1 && matrix[i][j - 1] > matrix[i][j])
maxPathFromHere = Math.max(maxPathFromHere, dfs(matrix, i, j - 1, 0, memo) + 1);
if (j < matrix[0].length - 1 && matrix[i][j + 1] > matrix[i][j])
maxPathFromHere = Math.max(maxPathFromHere, dfs(matrix, i, j + 1, 0, memo) + 1);
memo[i][j] = maxPathFromHere;
ans = Math.max(ans, length + maxPathFromHere);
return maxPathFromHere;
}
}