LeetCode Longest Increasing Path in a Matrix 记忆化搜索+DP [Hard]


Given an /(m /times n/) integers matrix, return the length of the longest increasing path in matrix.

From each cell, you can either move in four directions: left, right, up, or down. You may not move diagonally or move outside the boundary (i.e., wrap-around is not allowed).

Solution

我们需要从每个cell来进行搜索:对于每一个位置,我们用 /(dfs(i,j)/) 来返回位置 /((i,j)/) 为起点的最长递增序列长度,考虑转移,如果相邻位置的 /((ni,nj)/) 满足 /(m[ni][nj]>m[i][j]/):

/[dp[i][j] = /max(dp[i][j],dfs(ni,nj)+1)
/]

最后用 /(dp[i][j]/) 来返回 /(dfs(i,j)/)

点击查看代码
class Solution {
private:
    int dp[202][202];
    int ans = -1;
    int dir[4][2]={1,0, 0,1, 0,-1, -1,0};
    
    
    int check(int x, int y, int r, int c){
        if(x<0||x>=r||y<0||y>=c)return 0;
        return 1;
    }
    
    int dfs(int x, int y, int r, int c, vector<vector<int>>& m){
        if(dp[x][y])return dp[x][y];
        for(int i=0;i<4;i++){
            int nx = x+dir[i][0];
            int ny = y+dir[i][1];
            if(check(nx,ny,r,c)){
                if(m[nx][ny]>m[x][y])
                    dp[x][y] = max(dp[x][y],1+dfs(nx,ny,r,c,m));
            }
        }
        return dp[x][y];
    }
    
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int r = matrix.size();
        int c = matrix[0].size();
        if(r==1&&c==1) return matrix[0][0];
        
        for(int i=0;i<r;i++)
            for(int j=0;j<c;j++)
                ans = max(ans,dfs(i,j,r,c,matrix));
        return ans+1;
    }
};

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/274486.html

(0)
上一篇 2022年7月15日
下一篇 2022年7月15日

相关推荐

发表回复

登录后才能评论