给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
示例 1:
输入: nums =
[
[9,9,4],
[6,6,8],
[2,1,1]
]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]。
示例 2:
输入: nums =
[
[3,4,5],
[3,2,6],
[2,2,1]
]
输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。
1、看到这道题第一个想法就是DFS,然后就是记忆化搜索。但是我好久没写题了,写了半个多小时的记忆搜索,错得不忍直视。
2、先把最直接的dfs写出来
3、在上面的dfs基础上加上记忆数组
没有记忆数组的dfs
class Solution {
public:
int dx[4] = {-1, 0, 0, 1}, dy[4] = {0, 1, -1, 0}, ans=0;
void dfs(vector<vector<int>>& matrix, vector<vector<int>> &vis, int n, int m, int x, int y, int cnt){
ans = max(ans, cnt);
for(int i=0; i<4; i++){
int nx = x + dx[i], ny = y + dy[i];
if(nx>=0 && nx<n && ny>=0 && ny<m && matrix[nx][ny]<matrix[x][y]){
dfs(matrix, vis, n, m, nx, ny, cnt+1);
}
}
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
if(matrix.empty())
return 0;
int n = matrix.size(), m = matrix[0].size();
vector<vector<int>> vis(n, vector<int>(m, -1));
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
dfs(matrix, vis, n, m, i, j, 1);
return ans;
}
};
在上面的基础上加上记忆搜索
class Solution {
public:
int dx[4] = {-1, 0, 0, 1}, dy[4] = {0, 1, -1, 0};
int dfs(vector<vector<int>>& matrix, vector<vector<int>> &vis, int n, int m, int x, int y, int cnt){
if(vis[x][y] != -1)
return vis[x][y];
for(int i=0; i<4; i++){
int nx = x + dx[i], ny = y + dy[i];
if(nx>=0 && nx<n && ny>=0 && ny<m && matrix[nx][ny]<matrix[x][y]){
vis[x][y] = max(vis[x][y], cnt+dfs(matrix, vis, n, m, nx, ny, cnt+1));
}
}
vis[x][y] = max(vis[x][y]-cnt+1, 1);
return vis[x][y];
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
if(matrix.empty())
return 0;
int n = matrix.size(), m = matrix[0].size(), ans=0;
vector<vector<int>> vis(n, vector<int>(m, -1));
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
ans = max(ans, dfs(matrix, vis, n, m, i, j, 1));
return ans;
}
};