import java.util.*;
/**
* NC138 矩阵最长递增路径
* @author d3y1
*/
public class Solution {
private int ROW;
private int COL;
private int[] dx = new int[]{0, 1, 0, -1};
private int[] dy = new int[]{1, 0, -1, 0};
private int result = 0;
private int[][] dp;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 递增路径的最大长度
* @param matrix int整型二维数组 描述矩阵的每个数
* @return int整型
*/
public int solve (int[][] matrix) {
return solution(matrix);
}
/**
* 模拟法: 递归 && 动态规划
* @param matrix
* @return
*/
private int solution(int[][] matrix){
ROW = matrix.length;
COL = matrix[0].length;
dp = new int[ROW][COL];
for(int i=0; i<ROW; i++){
for(int j=0; j<COL; j++){
result = Math.max(result, dfs(matrix, i, j));
}
}
return result;
}
/**
* dfs
* @param matrix
* @param x
* @param y
*/
private int dfs(int[][] matrix, int x, int y){
if(dp[x][y] > 0){
return dp[x][y];
}
dp[x][y]++;
for(int i=0; i<4; i++){
int nextX = x+dx[i];
int nextY = y+dy[i];
if(isValid(nextX, nextY) && matrix[x][y]<matrix[nextX][nextY]){
dp[x][y] = Math.max(dp[x][y], dfs(matrix, nextX, nextY)+1);
}
}
return dp[x][y];
}
/**
* 是否合法(是否越界)
* @param x
* @param y
* @return
*/
private boolean isValid(int x, int y){
if(x<0 || x>=ROW || y<0 || y>=COL){
return false;
}
return true;
}
}