📜  门|门 IT 2008 |第 59 题(1)

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

门|门 IT 2008 | 第 59 题

这是一道经典的算法题,需要程序员有较强的算法思维和编程能力。题目描述如下:

给定一个n行m列的矩阵,每个格子里都有一个非负整数,表示从该点出发可以向下或向右走的步数。求从矩阵的左上角走到右下角,经过的步数之和最小是多少?

这道题可以使用动态规划算法来解决。可以先用一个二维数组dp来表示从矩阵左上角到dp[i][j]的最小步数。对于每个格子,其到达的最小步数可以由它左边和上面的格子推出来,即:

dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]

其中matrix是题目给定的矩阵,dp[i][j]表示从左上角走到(i,j)的最小步数。最终答案即为dp[n-1][m-1]。

下面是代码片段:

def minPathSum(matrix):
    n = len(matrix)
    m = len(matrix[0])
    dp = [[0]*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]

这段代码的时间复杂度是O(nm),空间复杂度也是O(nm)。实际上,空间复杂度可以优化到O(m),只需要用一个一维数组来表示dp即可。