📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|第 58 题(1)

📅  最后修改于: 2023-12-03 14:58:33.879000             🧑  作者: Mango

门| Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|第 58 题
题目描述

本题是2019年1月10日Sudo GATE 2020 Mock II考试中的第58题。该题目涉及编程算法和数据结构。

题目内容

给定一个N x M的矩阵,矩阵中的每个元素要么是1,要么是0。我们需要找到从左上角到右下角的一条路径,使得该路径上所有的元素和为最小。同时,我们有以下限制条件:

  • 每次移动可以向下或向右
  • 只能经过值为1的元素

编写一个程序来计算满足以上条件的最小元素和,并返回该和。

输入格式
  • 第一行包含两个整数N和M,分别表示矩阵的行和列数。
  • 接下来的N行,每行包含M个由空格分隔的整数,表示矩阵中的元素。
输出格式
  • 一个整数,表示满足条件的最小元素和。
示例

输入:

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))
复杂度分析
  • 时间复杂度:O(N * M),其中N和M分别是矩阵的行数和列数。我们需要遍历整个矩阵来计算dp数组的值。
  • 空间复杂度:O(N * M),我们使用了一个二维数组dp来存储从左上角到达每个元素的最小元素和。