class Solution {
    vector<int> direction = {-1, 0, 1, 0, -1};
    int dfs(vector<vector<int>>& matrix, int x, int y, vector<vector<int>>& dp){
	  // 如果不为零,说明在之前的递归中已经计算过以(x, y)为起点的最长路径,此时直接返回即可
        if(dp[x][y]!=0) return dp[x][y];
	  // 1. 如果为零,首先赋值自身为1
        dp[x][y] = 1;
	  // 2. 分别从四个方向出发计算最长路径长度
        for(int k=0; k<4; ++k){
            int xx = x + direction[k];
            int yy = y + direction[k+1];
		  // 3. 先判断是否越界,再判断大小是否满足递增
            if(xx>=0 && xx<matrix.size() && yy>=0 && yy<matrix[0].size() && matrix[xx][yy]>matrix[x][y]){
			  // 4. 取不同搜索方向中的最长路径
                dp[x][y] = max(dp[x][y], 1+dfs(matrix, xx, yy, dp));
            }
        }
        return dp[x][y];
    }
public:
    /**
     * 递增路径的最大长度
     * @param matrix int整型vector<vector<>> 描述矩阵的每个数
     * @return int整型
     */
    int solve(vector<vector<int> >& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        // dp[i][j]代表以matrix[i][j]为起点的最长递增路径长度
        vector<vector<int>> dp(m, vector<int>(n));
        int res = 0;
        for(int i=0; i<m; ++i){
            for(int j=0; j<n; ++j){
			  // 以不同坐标元素为起点计算最长路径长度,取最大者
                res = max(res, dfs(matrix, i, j, dp));
            }
        }
        return res;
    }
};