思路:暴力搜索每一个点,得到每个点的最大递增长度然后依据子问题的答案去更新问题的答案,为了避免重复计算,采用visit 数组作为备忘录来记录重复子问题。
class Solution {
public:
int m,n;
int longestIncreasingPath(vector<vector<int>>& matrix) {
m=matrix.size();
if(m==0) return 0;
n=matrix[0].size();
vector<vector<int>> visit(m,vector(n,0));
int ans=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
ans=max(DFS(visit,matrix,i,j,INT_MIN),ans);
}
}
return ans;
}
int DFS(vector<vector<int>>& visit,vector<vector<int>>& matrix,int i,int j,int sdvalue){
if(i<0||i==m||j<0||j==n) return 0;
int curvalue=matrix[i][j];
if(curvalue<=sdvalue) return 0;
int u,d,r,l;
if(!visit[i][j]){
u=DFS(visit,matrix,i-1,j,curvalue);
d=DFS(visit,matrix,i+1,j,curvalue);
l=DFS(visit,matrix,i,j-1,curvalue);
r=DFS(visit,matrix,i,j+1,curvalue);
visit[i][j]=max(max(r,l),max(u,d))+1;
}
return visit[i][j];
}
};