📅  最后修改于: 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$。
函数的返回值即为矩阵的最小路径和。