📅  最后修改于: 2023-12-03 14:58:33.879000             🧑  作者: Mango
本题是2019年1月10日Sudo GATE 2020 Mock II考试中的第58题。该题目涉及编程算法和数据结构。
给定一个N x M的矩阵,矩阵中的每个元素要么是1,要么是0。我们需要找到从左上角到右下角的一条路径,使得该路径上所有的元素和为最小。同时,我们有以下限制条件:
编写一个程序来计算满足以上条件的最小元素和,并返回该和。
输入:
3 3
1 0 1
1 1 1
0 1 1
输出:
3
从左上角到右下角的一条路径可以是 (0, 0) -> (0, 1) -> (1, 1) -> (2, 1) -> (2, 2),这样的路径上所有元素和为3。
这是一个典型的动态规划问题。我们可以使用二维数组dp来记录从左上角到达每个元素的最小元素和。初始化时,将第一行和第一列的元素依次相加,表示从左上角到达该点的最小元素和。然后,我们按照从上到下、从左到右的顺序遍历矩阵中的所有其他元素,并更新dp数组的值。在更新dp[i][j]时,我们有两种选择:从上方元素到达该点,或者从左方元素到达该点。我们选择其中的较小值,然后将其加上当前元素的值即可。最后,dp[N-1][M-1]即为所求的最小元素和。
def min_path_sum(matrix):
N = len(matrix)
M = len(matrix[0])
dp = [[0 for _ in range(M)] for _ in range(N)]
dp[0][0] = matrix[0][0]
# 初始化第一列的值
for i in range(1, N):
dp[i][0] = dp[i-1][0] + matrix[i][0]
# 初始化第一行的值
for j in range(1, M):
dp[0][j] = dp[0][j-1] + matrix[0][j]
# 计算从左上角到达其他点的最小元素和
for i in range(1, N):
for j in range(1, M):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]
return dp[N-1][M-1]
# 示例输入
matrix = [
[1, 0, 1],
[1, 1, 1],
[0, 1, 1]
]
# 计算并输出结果
print(min_path_sum(matrix))