📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 59(1)

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

国际空间研究组织 | ISRO CS 2013 | 问题 59

这是一道关于程序员能力的考察题目,涉及到了二维数组的操作。

题目描述

给定一个 n x m 的整数矩阵 mat,矩阵中的每个元素都是非负整数。现在你要从矩阵的左上角出发,到达矩阵的右下角,每次只能向下或向右走,沿途经过的所有数字之和是一个新的数字 num,求出所有这样的数字 num 的最大值。

输入格式

第一行包含两个整数 nm,表示矩阵的行数和列数。

接下来 n 行,每行包含 m 个非负整数,表示矩阵中的元素。

输出格式

输出一个整数,表示所有可能的数字 num 中的最大值。

样例

输入样例:

3 3
1 3 3
2 1 3
2 2 1

输出样例:

8
解题思路

这是一道典型的动态规划问题,具体思路如下:

  1. 定义状态 f[i][j],表示从左上角到达第 i 行第 j 列所经过的数字之和的最大值。
  2. 对于状态转移方程有:f[i][j] = max(f[i-1][j], f[i][j-1]) + mat[i][j],即每一步可以选择向下走或者向右走,所以当前位置的最大值取决于上方和左侧的最大值加上当前位置的值。
  3. 最后返回 f[n-1][m-1] 即可。
代码实现

以下是 Python 代码实现,时间复杂度为 $O(nm)$。

def max_sum(n, m, mat):
    f = [[0] * m for _ in range(n)]
    f[0][0] = mat[0][0]
    for i in range(1, n):
        f[i][0] = f[i-1][0] + mat[i][0]
    for j in range(1, m):
        f[0][j] = f[0][j-1] + mat[0][j]
    for i in range(1, n):
        for j in range(1, m):
            f[i][j] = max(f[i-1][j], f[i][j-1]) + mat[i][j]
    return f[n-1][m-1]