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的格子入队,跑拓扑,拓扑的层数即是答案数,这里就不提供代码,官方题解有了。。