导航

深度优先搜索 + 记忆化

Posted on 2022-05-31 12:27  wuqiu  阅读(30)  评论(0编辑  收藏  举报

矩阵中的最长递增路径

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-increasing-path-in-a-matrix

class Solution {
public:
    int memo[205][205]; // 建立了一个全局数组用做记忆化,也可以以函数参数的形式传递
    int dfs(int x,int y,vector<vector<int>>& m){ // 传引用要快很多很多
        if(memo[x][y] != 0){ return memo[x][y];} // 为 0 代表没有访问过这个点
        int m_ = m.size() - 1;int n_ = m[0].size() - 1;
        int dx[4] = {0,0,-1,1};int dy[4] = {-1,1,0,0}; //四个方向
        memo[x][y]++; //最小长度为 1
        for(int i = 0 ;i<= 3 ;i++){
            int newX = x + dx[i];int newY = y + dy[i];
            if(newX >= 0 && newX <= m_ && newY >= 0 && newY <= n_ && m[newX][newY] > m[x][y]){
                memo[x][y] = max(memo[x][y] ,1 + dfs(newX,newY,m));
            }
        }
        return memo[x][y];
    }
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int m = matrix.size() - 1;
        int n = matrix[0].size() - 1;
        int max_ = 0;int count = 0 ; 
        for(int i = 0 ;i<= m ;i++){
            for(int j = 0;j<= n; j++){ 
                if(memo[i][j] != 0 )    count = memo[i][j];
                else    count = dfs(i,j,matrix);
                if( count > max_)  max_ = count;
            }
        }
        return max_;
    }
};