📜  矩阵中递减路径的总数(1)

📅  最后修改于: 2023-12-03 15:27:17.616000             🧑  作者: Mango

矩阵中递减路径的总数

问题描述

给定一个大小为 m x n 的非负整数矩阵,你需要找出一条从左上角到右下角的递减路径,使得路径上的数字严格递减,同时求出路径的数量。

注意:在本题中,路径必须是一条从左上角到右下角的递减路径,即对于任意相邻的单元格 (i,j) 和 (i+1,j) 或者 (i,j+1) 中的数字,都有 nums[i][j] > nums[i+1][j] 或者 nums[i][j] > nums[i][j+1]。

解法

这是一道经典的动态规划问题,可以使用类似于矩阵中最长递增路径的解法,在每个单元格记录下以其为起点的递减路径数量。具体来说,设 dp[i][j] 表示以 (i,j) 为起点的递减路径数量,显然有:

dp[i][j] = 1
for (i',j') 是 (i,j) 的下一个节点且 nums[i'][j'] < nums[i][j]:
    dp[i][j] += dp[i'][j']

最终答案即为 dp[0][0],即从左上角到右下角的递减路径数量。

代码实现
def num_dec_paths(matrix: List[List[int]]) -> int:
    m, n = len(matrix), len(matrix[0])
    dp = [[1] * n for _ in range(m)]
    for i in range(m-1, -1, -1):
        for j in range(n-1, -1, -1):
            for ii, jj in [(i+1,j), (i,j+1)]:
                if 0 <= ii < m and 0 <= jj < n and matrix[ii][jj] < matrix[i][j]:
                    dp[i][j] += dp[ii][jj]
    return dp[0][0]
时间复杂度

算法的时间复杂度为 $O(mn)$,其中 m 和 n 分别为矩阵的行数和列数。