📜  门| GATE MOCK 2017 |问题13(1)

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

门 | GATE MOCK 2017 | 问题13

本文介绍了 GATE MOCK 2017 考试中的第 13 道题目。该问题要求求出矩阵中最小路径的和,路径必须从左上角到右下角,每次只能向右或向下移动一个位置。

问题描述

一个 $n \times m$ 的矩阵,每个位置上都有一个正整数 $a_{i,j}$。从左上角出发,每次只能向右或向下移动一个位置,最终到达右下角。求最小路径和。

解题思路

这是一道动态规划问题。它可以使用一个二维数组 dp 存储每个位置的最小路径和。其中,$dp_{i,j}$ 表示从左上角到达 $(i,j)$ 的最小路径和。

状态转移方程为:

$$ dp_{i,j} = \min(dp_{i-1,j}, dp_{i,j-1}) + a_{i,j} $$

边界情况为:

$$ \begin{aligned} dp_{0,0} &= a_{0,0} \ dp_{0,j} &= dp_{0,j-1} + a_{0,j} \ dp_{i,0} &= dp_{i-1,0} + a_{i,0} \end{aligned} $$

最终答案为 $dp_{n-1,m-1}$。

代码实现
def min_path_sum(matrix):
    m, n = len(matrix), len(matrix[0])
    dp = [[0] * n for _ in range(m)]
    dp[0][0] = matrix[0][0]
    for i in range(1, m):
        dp[i][0] = dp[i-1][0] + matrix[i][0]
    for j in range(1, n):
        dp[0][j] = dp[0][j-1] + matrix[0][j]
    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]
    return dp[-1][-1]

其中,matrix 是一个二维数组,表示输入矩阵。函数的返回值为最小路径和。