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;
    }
};