leetcode 矩阵中的最长递增路径 困难

 

 

记忆化:如果一个点搜索过了,那么这个从这个点出发能够满足题目的最长路径长度便是已知。

class Solution {
public:
    int longestIncreasingPath(const vector<vector<int>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return 0;
        visit.resize(matrix.size(), vector<int>(matrix[0].size(), 0));
        int ans = 0;
        for(int i = 0; i < matrix.size(); ++ i) {
            for(int j = 0; j < matrix[i].size(); ++ j) {
                if(visit[i][j] == 0) solve(matrix, i, j);
                ans = max(ans, visit[i][j]);
            }
        }
        return ans;
    }

private:
    vector<vector<int>> visit;      // visit[i][j] 表示经过 i, j 的最大递增长度
    int to[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

    void solve(const vector<vector<int>>& matrix, int i, int j) {
        visit[i][j] = 1;
        for(int k = 0; k < 4; ++ k) {
            int ii = i + to[k][0];
            int jj = j + to[k][1];
            if(ii < 0 || ii >= matrix.size() || jj < 0 || jj >= matrix[0].size()) continue;
            if(matrix[ii][jj] <= matrix[i][j]) continue;
            if(visit[ii][jj] == 0) solve(matrix, ii, jj);
            visit[i][j] = max(visit[i][j], visit[ii][jj] + 1);
        }
    }
};

 

posted @ 2021-09-16 13:45  rookie_Acmer  阅读(26)  评论(0)    收藏  举报