📌  相关文章
📜  通过向右、向下或对角线移动从 M x N 矩阵的左上角到右下角的可能路径计数(1)

📅  最后修改于: 2023-12-03 14:58:04.823000             🧑  作者: Mango

通过向右、向下或对角线移动从 M x N 矩阵的左上角到右下角的可能路径计数

这是一个经典的动态规划问题,通常通过递归或记忆化搜索实现。我们也可以使用动态规划来解决。

设 dp[i][j] 表示从 (0,0) 到 (i,j) 的路径总数。

对于第一行和第一列,因为只有一种移动方式,所以 dp[i][0] 和 dp[0][j] 都为 1。

对于其他的位置 (i,j),有三种移动方式,即向右、向下和对角线。因此,

dp[i][j] = dp[i-1][j] + dp[i][j-1] + dp[i-1][j-1]

其中,dp[i-1][j] 表示从 (0,0) 到 (i-1,j) 的路径总数;dp[i][j-1] 表示从 (0,0) 到 (i,j-1) 的路径总数;dp[i-1][j-1] 表示从 (0,0) 到 (i-1,j-1) 的路径总数。

最终的答案是 dp[M-1][N-1]。

下面是 Python 代码实现:

def count_paths(m, n):
    dp = [[1] * n for _ in range(m)]

    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = dp[i-1][j] + dp[i][j-1] + dp[i-1][j-1]

    return dp[m-1][n-1]

时间复杂度为 O(MN),空间复杂度为 O(MN)。

注意:对于非常大的矩阵,这种方法可能会导致内存不足。在这种情况下,我们可以使用滚动数组或优化空间的其他方法。