Problem Statement
(Source) Given an integer matrix, find the length of the longest increasing path.
From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).
Example 1:
nums = [ [9,9,4], [6,6,8], [2,1,1] ]
Return 4
The longest increasing path is [1, 2, 6, 9].
Example 2:
nums = [ [3,4,5], [3,2,6], [2,2,1] ]
Return 4
The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.
Analysis
This is an Dynamic Programming and Depth-first Search
problem. The idea is to reconstruct the matrix first. Then use an dp
“array” length: @type list
to compute and save solution of sub-problems, to achieve the global optimal solution at last.
Solution
Bottom-up DP:
class Solution(object):
def longestIncreasingPath(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: int
"""
mat = {i + j * 1j : v for i, row in enumerate(matrix) for j, v in enumerate(row)}
length = {}
for z in sorted(mat, key=mat.get):
length[z] = 1 + max([length[Z] for Z in z + 1, z - 1, z + 1j, z - 1j if Z in mat and mat[z] > mat[Z]] or [0])
return max(length.values() or [0])