📌  相关文章
📜  最小化从矩阵的左上角到达右下角的成本,每次移动都给定单独的成本(1)

📅  最后修改于: 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$ 分别是矩阵的行数和列数。