📅  最后修改于: 2023-12-03 15:37:14.967000             🧑  作者: Mango
这是一道关于程序员能力的考察题目,涉及到了二维数组的操作。
给定一个 n
x m
的整数矩阵 mat
,矩阵中的每个元素都是非负整数。现在你要从矩阵的左上角出发,到达矩阵的右下角,每次只能向下或向右走,沿途经过的所有数字之和是一个新的数字 num
,求出所有这样的数字 num
的最大值。
第一行包含两个整数 n
和 m
,表示矩阵的行数和列数。
接下来 n
行,每行包含 m
个非负整数,表示矩阵中的元素。
输出一个整数,表示所有可能的数字 num
中的最大值。
输入样例:
3 3
1 3 3
2 1 3
2 2 1
输出样例:
8
这是一道典型的动态规划问题,具体思路如下:
f[i][j]
,表示从左上角到达第 i
行第 j
列所经过的数字之和的最大值。f[i][j] = max(f[i-1][j], f[i][j-1]) + mat[i][j]
,即每一步可以选择向下走或者向右走,所以当前位置的最大值取决于上方和左侧的最大值加上当前位置的值。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]