LC.329.矩阵中的最长递增路径(记忆化搜索)

LC.329.矩阵中的最长递增路径(记忆化搜索)

思路:

1.记忆化搜索,这个实现思路很简单,具体看代码。

int d[4][2]={0,1,0,-1,1,0,-1,0},vis[500][500];
class Solution {
public:
    vector<vector<int> >dp,a;   
	int mx,n,m;
    int dfs(int x,int y){
        if(dp[x][y]) return dp[x][y];
        dp[x][y]++;
        int ans=0;
        for(int i=0;i<4;i++){
            int nx=x+d[i][0],ny=y+d[i][1];
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nx][ny]&&a[nx][ny]>a[x][y]){
                 dp[x][y]=max(dp[x][y],dfs(nx,ny)+1);
            }
        }
        return dp[x][y];
    }
    int longestIncreasingPath(vector<vector<int>>& b) {
        if(b.empty()) return 0;
           n=b.size(),m=b[0].size();
           a=b;
          mx=0;
          dp.resize(n+1,vector<int>(m+1,0));
          for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                 mx=max(mx,dfs(i,j));
            }
        return mx;
    }
};

2.拓扑排序,考虑对每个格子对于它的相连格子比他大的连一条出边,然后建图,将出度为0的格子入队,跑拓扑,拓扑的层数即是答案数,这里就不提供代码,官方题解有了。。

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107590574