📅  最后修改于: 2023-12-03 15:40:15.598000             🧑  作者: Mango
这是一个经典的动态规划问题,它可以用来求解从矩阵的左上角到右下角的最小路径和。具体地说,我们要找到一条从左上角开始,每次向右或向下移动一步,最终到达右下角的路径,使得路径上经过的所有元素之和最小。
我们可以使用动态规划来解决这个问题。具体来说,我们定义一个二维数组 $dp$,其中 $dp[i][j]$ 表示从起点到达位置 $(i,j)$ 的最小成本。显然,$dp[0][0]$ 应该是起点的成本,即 $dp[0][0] = cost[0][0]$。
接下来,我们考虑如何计算 $dp[i][j]$。由于我们只能向右或向下移动一步,因此到达 $(i,j)$ 的最小成本要么是从 $(i-1,j)$ 向下移动,要么是从 $(i,j-1)$ 向右移动。因此,我们可以得到状态转移方程:
$$dp[i][j] = \min(dp[i-1][j], dp[i][j-1]) + cost[i][j]$$
其中,$cost[i][j]$ 表示从 $(i,j)$ 这个位置出发的移动成本。最后,我们返回 $dp[m-1][n-1]$,其中 $m$ 和 $n$ 分别是矩阵的行数和列数,即为从起点到达右下角的最小成本。
以下是基于上述思路的 Python 代码实现:
def minPathCost(cost):
if not cost:
return 0
m, n = len(cost), len(cost[0])
dp = [[0] * n for _ in range(m)]
dp[0][0] = cost[0][0]
# 初始化第一行和第一列
for j in range(1, n):
dp[0][j] = dp[0][j-1] + cost[0][j]
for i in range(1, m):
dp[i][0] = dp[i-1][0] + cost[i][0]
# 动态规划计算最小成本
for i in range(1, m):
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + cost[i][j]
return dp[m-1][n-1]
该算法的时间复杂度是 $O(mn)$,其中 $m$ 和 $n$ 分别是矩阵的行数和列数。