class Solution {
private:
    vector<vector<int>> range = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 递增路径的最大长度
     * @param matrix int整型vector<vector<>> 描述矩阵的每个数
     * @return int整型
     */
    int solve(vector<vector<int> >& matrix) {
        // write code here
        int m = matrix.size(), n = matrix[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 1));
        int res = 1;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                dfs(matrix, dp, m, n, i, j);
                res = max(res, dp[i][j]);
            }
        }
        return res;
    }
    
    void dfs(vector<vector<int>>& matrix, vector<vector<int>>& dp, 
            int m, int n, int cur_i, int cur_j){
        if(cur_i<0 || cur_i>=m || cur_j<0 || cur_j>=n){
            return;
        }
        
        if(dp[cur_i][cur_j] > 1){
            return;
        }
        
        int res = 0;
        for(int i=0; i<range.size(); i++){
            int new_i = cur_i + range[i][0];
            int new_j = cur_j + range[i][1];
            if(new_i<0 || new_i>=m || new_j<0 || new_j>=n){
                continue;
            }
            if(matrix[cur_i][cur_j] > matrix[new_i][new_j]){
                dfs(matrix, dp, m, n, new_i, new_j);
                res = max(res, dp[new_i][new_j]);
            }
        }
        dp[cur_i][cur_j] = res+1;
    }
    
};