📅  最后修改于: 2023-12-03 14:58:04.823000             🧑  作者: Mango
这是一个经典的动态规划问题,通常通过递归或记忆化搜索实现。我们也可以使用动态规划来解决。
设 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)。
注意:对于非常大的矩阵,这种方法可能会导致内存不足。在这种情况下,我们可以使用滚动数组或优化空间的其他方法。