• 递归 ```java public int longestIncreasingPath(int[][] matrix) {
      1. int longest = 0;
      2. for (int i = 0; i < matrix.length; i++) {
      3. for (int j = 0; j < matrix[0].length; j++) {
      4. longest = Math.max(longest, process(matrix, i, j));
      5. }
      6. }
      7. return longest;
      }
    // 法一:递归
    public int process(int[][] matrix, int i, int j) {
        int next = 0;
        if (i > 0 && matrix[i - 1][j] > matrix[i][j]) {
            next = Math.max(next,process(matrix, i - 1, j));
        }
        if (i + 1 < matrix.length && matrix[i + 1][j] > matrix[i][j]) {
            next = Math.max(next,process(matrix, i + 1, j));
    
        }
        if (j > 0 && matrix[i][j - 1] > matrix[i][j]) {
            next = Math.max(next,process(matrix, i, j - 1));
    
        }
        if (j + 1 < matrix.length && matrix[i][j + 1] > matrix[i][j]) {
            next = Math.max(next,process(matrix, i , j + 1));
    
        }
        return 1 + next;
    }
    
    
    - 优化: 只要行跟列定了,结果就定了, 因此可以考虑记忆化搜索, (记忆化搜索和动态规划等效)
    ```java
     public int longestIncreasingPath(int[][] matrix) {
         int longest = 0;
         int[][] dp = new int[matrix.length][matrix[0].length];
         for (int i = 0; i < matrix.length; i++) {
             for (int j = 0; j < matrix[0].length; j++) {
                 longest = Math.max(longest, process(matrix, i, j, dp));
             }
         }
         return longest;
     }
    
    
        // 在法一的基础上加记忆化搜索
        public int process(int[][] matrix, int i, int j, int[][] dp) {
            if (dp[i][j] != 0) {
                return dp[i][j];
            }
    
            int next = 0;
            if (i > 0 && matrix[i - 1][j] > matrix[i][j]) {
                next = Math.max(next,process(matrix, i - 1, j, dp));
            }
            if (i + 1 < matrix.length && matrix[i + 1][j] > matrix[i][j]) {
                next = Math.max(next,process(matrix, i + 1, j, dp));
    
            }
            if (j > 0 && matrix[i][j - 1] > matrix[i][j]) {
                next = Math.max(next,process(matrix, i, j - 1, dp));
    
            }
            if (j + 1 < matrix[0].length && matrix[i][j + 1] > matrix[i][j]) {
                next = Math.max(next,process(matrix, i , j + 1, dp));
            }
            dp[i][j] = 1 + next;
            return 1 + next;
        }