class Solution { public: bool check(int x,int y,vector<vector<int>>&matrix,vector<vector<bool>>&f) { return x>=0&&x<matrix.size()&&y>=0&&y<matrix[0].size()&&!f[x][y]; } void dfs(int x,int y,vector<vector<int>>&matrix,vector<vector<bool>>&f,vector<vector<int>>&dp) { if(dp[x][y])return; vector<vector<int>>dir{{1,0},{0,1},{-1,0},{0,-1}}; for(auto m:dir) { int xx=m[0]+x,yy=m[1]+y; if(check(xx,yy,matrix,f)&&matrix[xx][yy]>matrix[x][y]) { f[xx][yy]=true; dfs(xx,yy,matrix,f,dp); f[xx][yy]=false; if(dp[x][y]<dp[xx][yy]+1)dp[x][y]=dp[xx][yy]+1; } } if(!dp[x][y])dp[x][y]=1; } int solve(vector<vector<int> >& matrix) { vector<vector<bool>>f(matrix.size()+10,vector<bool>(matrix[0].size()+10,false)); vector<vector<int>>dp(matrix.size()+10,vector<int>(matrix[0].size()+10,0)); int ma=0xc0c0c0c0,res=0; for(int i=0;i<matrix.size();i++) for(int j=0;j<matrix[0].size();j++) { if(dp[i][j])continue; dfs(i,j,matrix,f,dp); ma=max(ma,dp[i][j]); } return ma; } };