方法:深度优先搜索+动态规划
由于不知道以哪个位置作为起点能得到最长递增路径长度,所以需要遍历每个位置,找出每个位置为起点的最长路径长度,最后比较就可以得到整个矩阵的最大递增的长度了。而每个起点的下一位置可以是上下左右四个方向,又需要挨个遍历,选好一个点后又成了子问题,所以采用深度优先搜索方法,并且设置一个动态规划数组dp来记录每个位置的最大长度。
步骤:
1、排除空矩阵情况。
2、创建dp数组,遍历每个位置,通过调用深度优先搜索算法得到当前最大长度,维护最大长度。
3、由于需要遍历四个方向,所以可以设置一个数组来表示方向移动情况。
4、对于每个起点,使用dfs查找最长的递增路径:只要下一个位置比当前的位置数字大,就可以深入,同时累加路径长度。
import java.util.*;
public class Solution {
//上下左右四个方向移动一位的数组表示
int[][] directs = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
//递归,深度搜索,返回最大的路径长度。dp记录的是当前i,j位置的最大路径长度
private int n,m;
public int dfs(int [][] matrix,int[][] dp,int i,int j){
//当前位置被访问过则跳过
if(dp[i][j]!=0){
return dp[i][j];
}
//当前位置未被访问,路径长度加一
dp[i][j]++;
//遍历四个方向
for(int k=0;k<4;++k){
int nexti = i + directs[k][0];
int nextj = j + directs[k][1];
//判断下一步是否可行
if(nexti>=0&&nexti<n&&nextj>=0&&nextj<m&&matrix[nexti][nextj]>matrix[i][j]){
dp[i][j] = Math.max(dp[i][j],dfs(matrix,dp,nexti,nextj)+1);//向下遍历,长度加一
}
}
return dp[i][j];
}
public int solve (int[][] matrix) {
n=matrix.length;//行数
m=matrix[0].length;//列数
if(n==0||m==0){
return 0;
}
int res=0;
int [][] dp = new int[n+1][m+1];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
//找最大值
res = Math.max(res,dfs(matrix,dp,i,j));
}
}
return res;
}
}


京公网安备 11010502036488号