📜  门| GATE-CS-2004 |第 74 题(1)

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

题目介绍

这是一道 GATE-CS-2004 的考题,题目编号为第 74 题。这道题目旨在测试程序员的数据结构和算法知识。

题目描述

给定一个 $m\times n$ 的矩阵 $A$,矩阵中的每个元素都是一个非负整数。你需要给出一个算法,找到从矩阵的左上角 $(0,0)$ 到右下角 $(m-1,n-1)$ 的最小路径和。

每一步只能移动到相邻的格子,即只能向下或向右移动。

输入输出格式

输入格式:

第一行包含两个整数 $m$ 和 $n$,表示矩阵的行数和列数 $(1\leq m,n\leq 200)$。

接下来的 $m$ 行,每行包含 $n$ 个空格隔开的非负整数,表示矩阵中对应位置的元素 $(0\leq A_{i,j}\leq 100)$。

输出格式:

输出矩阵的最小路径和。

解题思路

这里我们可以考虑使用动态规划的思想来解决这个问题。

我们定义一个二维数组 $dp$,其中 $dp_{i,j}$ 表示从 $(0,0)$ 到 $(i,j)$ 的最小路径和。考虑到每个格子只能从其上方或左侧的格子移动过来,因此可以得到如下动态转移方程:

$$ dp_{i,j}=\min{dp_{i-1,j},dp_{i,j-1}}+A_{i,j} $$

在上述方程中,如果 $i=0$ 或 $j=0$,则只有一种可能的路径,因此 $dp_{i,j}$ 的值可以直接计算出来。

最后,$dp_{m-1,n-1}$ 就是矩阵的最小路径和,返回即可。

代码实现

下面是使用 Python 语言实现上述算法的程序代码片段:

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 j in range(1, n):
        dp[0][j] = dp[0][j-1] + matrix[0][j]
    for i in range(1, m):
        dp[i][0] = dp[i-1][0] + matrix[i][0]
    # 动态转移计算 dp[i][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[m-1][n-1]

该函数的参数 matrix 是一个二维整数列表,其大小为 $m\times n$,代表题目描述中的矩阵 $A$。

函数的返回值即为矩阵的最小路径和。