import operator
class Solution(object):
def longestIncreasingPath(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: int
"""
def check_boundary(matrix, (row, col)):
return 0 <= row < len(matrix) and 0 <= col < len(matrix[0])
def dfs(current=(0,0), matrix, visited=set(), memory={}):
cost = 0
print(current)
if not check_boundary(matrix, current):
return -1
if current in visited:
return memory[current]
for direction in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
new = current[0] + direction[0], current[1] + direction[1]
visited.add(current)
print(new)
if check_boundary(matrix, new) and matrix[current[0]][current[1]] > matrix[new[0]][new[1]]:
cost = max(cost, 1 + dfs(new, matrix, visited, memory))
memory[(current)] = cost
return cost
if not matrix:
return 0
maximum = 0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
maximum = max(maximum, dfs((i,j), matrix))
return maximum + 1
aW1wb3J0IG9wZXJhdG9yCmNsYXNzIFNvbHV0aW9uKG9iamVjdCk6CiAgICBkZWYgbG9uZ2VzdEluY3JlYXNpbmdQYXRoKHNlbGYsIG1hdHJpeCk6CiAgICAgICAgIiIiCiAgICAgICAgOnR5cGUgbWF0cml4OiBMaXN0W0xpc3RbaW50XV0KICAgICAgICA6cnR5cGU6IGludAogICAgICAgICIiIgogICAgICAgIGRlZiBjaGVja19ib3VuZGFyeShtYXRyaXgsIChyb3csIGNvbCkpOgogICAgICAgICAgICByZXR1cm4gMCA8PSByb3cgPCBsZW4obWF0cml4KSBhbmQgMCA8PSBjb2wgPCBsZW4obWF0cml4WzBdKQoKICAgICAgICBkZWYgZGZzKGN1cnJlbnQ9KDAsMCksIG1hdHJpeCwgdmlzaXRlZD1zZXQoKSwgbWVtb3J5PXt9KToKICAgICAgICAgICAgY29zdCA9IDAKICAgICAgICAgICAgcHJpbnQoY3VycmVudCkKICAgICAgICAgICAgaWYgbm90IGNoZWNrX2JvdW5kYXJ5KG1hdHJpeCwgY3VycmVudCk6CiAgICAgICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICAgICAgaWYgY3VycmVudCBpbiB2aXNpdGVkOgogICAgICAgICAgICAgICAgcmV0dXJuIG1lbW9yeVtjdXJyZW50XQogICAgICAgICAgICBmb3IgZGlyZWN0aW9uIGluIFtbLTEsIDBdLCBbMSwgMF0sIFswLCAtMV0sIFswLCAxXV06CiAgICAgICAgICAgICAgICBuZXcgPSBjdXJyZW50WzBdICsgZGlyZWN0aW9uWzBdLCBjdXJyZW50WzFdICsgZGlyZWN0aW9uWzFdCiAgICAgICAgICAgICAgICB2aXNpdGVkLmFkZChjdXJyZW50KQogICAgICAgICAgICAgICAgcHJpbnQobmV3KQogICAgICAgICAgICAgICAgaWYgY2hlY2tfYm91bmRhcnkobWF0cml4LCBuZXcpIGFuZCBtYXRyaXhbY3VycmVudFswXV1bY3VycmVudFsxXV0gPiBtYXRyaXhbbmV3WzBdXVtuZXdbMV1dOgogICAgICAgICAgICAgICAgICAgIGNvc3QgPSBtYXgoY29zdCwgMSArIGRmcyhuZXcsIG1hdHJpeCwgdmlzaXRlZCwgbWVtb3J5KSkKICAgICAgICAgICAgbWVtb3J5WyhjdXJyZW50KV0gPSBjb3N0CiAgICAgICAgICAgIHJldHVybiBjb3N0CgogICAgICAgIGlmIG5vdCBtYXRyaXg6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgbWF4aW11bSA9IDAKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obWF0cml4KSk6CiAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihtYXRyaXhbMF0pKToKICAgICAgICAgICAgICAgIG1heGltdW0gPSBtYXgobWF4aW11bSwgZGZzKChpLGopLCBtYXRyaXgpKQogICAgICAgIHJldHVybiBtYXhpbXVtICsgMQ==