Python 中的矩阵最长递增路径
假设我们有一个矩阵;我们需要找到最长递增路径的长度。从每个单元格,我们可以移动到四个方向——左、右、上或下。我们不能对角移动或移出边界。
因此,如果输入类似于
9 | 9 | 4 |
6 | 6 | 8 |
2 | 1 | 1 |
则输出将为 4,因为最长递增路径为 [3, 4, 5, 6]。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 solve()。这将接收 i、j、matrix 作为参数。
如果 dp[i,j] 不为零,则
返回 dp[i, j]
dp[i, j] := 1
temp := 0
对于 r 从 i-1 到 i+2,执行
对于 c 从 j-1 到 j+2,执行
如果 r 等于 i 且 c 等于 j 或 (|r-i| 等于 1 且 |c-j| 等于 1),则
进入下一个迭代
如果 c>=0 且 r>=0 且 r< 矩阵的行数 且 c < matrix[0] 的列大小 且 matrix[r, c]>matrix[i, j],则
temp := temp 和 solve(r, c, matrix) 的最大值
dp[i, j] := dp[i, j] + temp
返回 dp[i, j]
从主方法执行以下操作:
如果 matrix 不为零,则
返回 0
dp := 一个与给定矩阵大小相同的矩阵,并填充 0
ans := 0
对于 i 从 0 到 matrix 的大小,执行
对于 j 从 0 到 matrix[0] 的大小,执行
如果 dp[i, j] 等于 0,则
solve(i, j, matrix)
返回 ans
示例
让我们看看以下实现以获得更好的理解:
class Solution(object): def solve(self,i,j,matrix): if self.dp[i][j]: return self.dp[i][j] self.dp[i][j] = 1 temp = 0 for r in range(i-1,i+2): for c in range(j-1,j+2): if r==i and c==j or (abs(r-i)==1 and abs(c-j)==1): continue if c>=0 and r>=0 and r<len(matrix) and c<len(matrix[0]) and matrix[r][c]>matrix[i][j]: temp = max(temp,self.solve(r,c,matrix)) self.dp[i][j]+=temp return self.dp[i][j] def longestIncreasingPath(self, matrix): if not matrix: return 0 self.dp = [ [0 for i in range(len(matrix[0]))] for j in range(len(matrix))] self.ans = 0 for i in range(len(matrix)): for j in range(len(matrix[0])): if self.dp[i][j]==0: self.solve(i,j,matrix) self.ans = max(self.ans,self.dp[i][j]) return self.ans ob = Solution() print(ob.longestIncreasingPath([[9,9,4],[6,6,8],[2,1,1]]))
输入
[[9,9,4],[6,6,8],[2,1,1]]
输出
4
广告