题目
二维数组(矩阵)中的最长递增路径长度
思路
动态规划
状态 : dp[ i ] [ j ]表示以当前位置为结尾的最长递增路径长度,
状态转移, 从上下左右走一步到当前位置,上下左右最大的加一。
代码
class Solution:
def inarea(self, x, y, m, n):
if 0 <= x < m and 0 <= y < n:
return True
return False
def dfs(self, matrix, x, y, dp):
m = len(matrix)
n = len(matrix[0])
d = [[1,0],[0,1],[-1,0],[0,-1]]
if dp[x][y]:
return dp[x][y]
res = 1
for i in range(4): # 对上下左右递归
nx = x + d[i][0]
ny = y + d[i][1]
if self.inarea(nx, ny, m, n) is True and matrix[nx][ny] > matrix[x][y]:
res = max(res, self.dfs(matrix, nx, ny, dp)+1)
dp[x][y] = res
return res
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
m = len(matrix)
if not m:
return 0
n = len(matrix[0])
if not n:
return 0
res = 0
dp = [[0]*n for i in range(m)]
for i in range(m):
for j in range(n):
res = max(res, self.dfs(matrix, i, j, dp))
return res