思路
从每个点下去dfs。然后对于每个点都进行dfs,并且memo记录的是当前点到终点的最大步数。
cpp
class Solution {
public:
static constexpr int dirs[4][2] = {{0,1},{0,-1},{1, 0},{-1,0}};
int longestIncreasingPath(vector<vector<int>>& matrix) {
int n = matrix.size();
int m = matrix[0].size();
if(n == 0 or m == 0) return 0;
vector<vector<int>> memo(n , vector<int>(m, 0));
int ans = 0;
// 从每一个点深入去看。
for(int i=0;i<n;i++){
for(int j =0 ;j<m;j++){
ans = max(ans, dfs(i,j,memo, matrix));
}
}
return ans;
}
int dfs(int x, int y, vector<vector<int>>& memo, const vector<vector<int>>& mat){
// 如果这个x,y这个点有值了说明这个点到终点(最高点)走了多少步
if(memo[x][y]!=0) return memo[x][y];
int n = mat.size();
int m = mat[0].size();
++memo[x][y];
// 从这个点看四周。
for(int k = 0;k<4;k++){
int new_x = x+dirs[k][0];
int new_y = y+dirs[k][1];
if(new_x>=0 and new_x<n and new_y>=0 and new_y<m and mat[new_x][new_y]>mat[x][y]){
memo[x][y] = max(memo[x][y], dfs(new_x, new_y, memo, mat)+1);
}
}
return memo[x][y];
}
};