classSolution{public:intlongestIncreasingPath(vector<vector<int>>&matrix){constintm=matrix.size();constintn=matrix[0].size();intans=0;vector<vector<int>>memo(m,vector<int>(n));for(inti=0;i<m;++i)for(intj=0;j<n;++j)ans=max(ans,dfs(matrix,i,j,INT_MIN,memo));returnans;}private:// memo[i][j] := the LIP starting from matrix[i][j]intdfs(constvector<vector<int>>&matrix,inti,intj,intprev,vector<vector<int>>&memo){if(i<0||i==matrix.size()||j<0||j==matrix[0].size())return0;if(matrix[i][j]<=prev)return0;int&ans=memo[i][j];if(ans>0)returnans;constintcurr=matrix[i][j];returnans=1+max({dfs(matrix,i+1,j,curr,memo),dfs(matrix,i-1,j,curr,memo),dfs(matrix,i,j+1,curr,memo),dfs(matrix,i,j-1,curr,memo)});}};
classSolution{publicintlongestIncreasingPath(int[][]matrix){finalintm=matrix.length;finalintn=matrix[0].length;intans=0;// memo[i][j] := the LIP starting from matrix[i][j]int[][]memo=newint[m][n];for(inti=0;i<m;++i)for(intj=0;j<n;++j)ans=Math.max(ans,dfs(matrix,i,j,Integer.MIN_VALUE,memo));returnans;}privateintdfs(int[][]matrix,inti,intj,intprev,int[][]memo){if(i<0||i==matrix.length||j<0||j==matrix[0].length)return0;if(matrix[i][j]<=prev)return0;if(memo[i][j]>0)returnmemo[i][j];finalintcurr=matrix[i][j];finalinta=dfs(matrix,i+1,j,curr,memo);finalintb=dfs(matrix,i-1,j,curr,memo);finalintc=dfs(matrix,i,j+1,curr,memo);finalintd=dfs(matrix,i,j-1,curr,memo);returnmemo[i][j]=1+Math.max(Math.max(a,b),Math.max(c,d));}}