func longestIncreasingPath(matrix [][]int) int {
n, m := len(matrix), len(matrix[0])
ans := 0
mem := make([][]int, n)
for i := 0; i < n; i ++ {
mem[i] = make([]int, m)
}
for i := 0; i < n; i ++ {
for j := 0; j < m; j ++ {
ans = max(ans, search(matrix, mem, i, j))
}
}
return ans
}
func search(matrix, mem [][]int, i, j int) int {
if mem[i][j] != 0 {
return mem[i][j]
}
biggest := 1
dx := []int{1, 0, -1, 0}
dy := []int{0, 1, 0, -1}
for k := 0; k < 4; k ++ {
x := dx[k] + i
y := dy[k] + j
if x < 0 || x >= len(matrix) || y < 0 || y >= len(matrix[0]) {
continue
}
if matrix[x][y] > matrix[i][j] {
biggest = max(biggest, 1 + search(matrix, mem, x, y))
}
}
mem[i][j] = biggest
return biggest
}