# 329. Longest Increasing Path in a Matrix

#### Hard

***

Given an `m x n` integers `matrix`, return *the length of the longest increasing path in* `matrix`.

From each cell, you can either move in four directions: left, right, up, or down. You **may not** move **diagonally** or move **outside the boundary** (i.e., wrap-around is not allowed).

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2021/01/05/grid1.jpg)

```
Input: matrix = [[9,9,4],[6,6,8],[2,1,1]]
Output: 4
Explanation: The longest increasing path is [1, 2, 6, 9].
```

**Example 2:**

![](https://assets.leetcode.com/uploads/2021/01/27/tmp-grid.jpg)

```
Input: matrix = [[3,4,5],[3,2,6],[2,2,1]]
Output: 4
Explanation: The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.
```

**Example 3:**

```
Input: matrix = [[1]]
Output: 1
```

&#x20;

**Constraints:**

* `m == matrix.length`
* `n == matrix[i].length`
* `1 <= m, n <= 200`
* `0 <= matrix[i][j] <= 231 - 1`

```python
class Solution:
    def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
        self.matrix = matrix
        self.rows = len(matrix)
        self.cols = len(matrix[0])
        self.dp = [[0] * self.cols for i in range(self.rows)]
        result = 0
        for i in range(self.rows):
            for j in range(self.cols):
                result = max(result, self.dfs(i,j))
        return result
    
    def dfs(self, row, col):
        if not self.dp[row][col]:
            self.dp[row][col] = 1 + max(
                self.dfs(row-1, col) if row and self.matrix[row][col] < self.matrix[row-1][col] else 0,
                self.dfs(row+1, col) if row+1 < self.rows and self.matrix[row][col] < self.matrix[row+1][col] else 0,
                self.dfs(row, col-1) if col and self.matrix[row][col] < self.matrix[row][col-1] else 0,
                self.dfs(row, col+1) if col+1 < self.cols and self.matrix[row][col] < self.matrix[row][col+1] else 0
            )
        return self.dp[row][col]
```
