题目描述
给定一个二维整数矩阵,要在这个矩阵中。选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大
我们把这个子矩阵称为 “和最大子矩阵”,子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域
输入描述
输入的第一行包含两个整数N,M
(1 <= N, M <= 10)
表示一个 N 行 M 列的矩阵
下面有N
行 每行有M
个整数
同一行中每两个数字之间有一个空格
最后一个数字后面没有空格
所有的数字得在-1000 ~ 1000
之间
输出描述
输出一行,一个数字。表示选出的“和最大子矩阵”内所有数字的和
示例
输入
3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3
输出
20
说明
一个3*4
的矩阵中 后面3
列的和为20
,和最大
def max_submatrix_sum(N, M, matrix):
# 计算前缀和
prefixSum = [[0] * (M + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for j in range(1, M + 1):
prefixSum[i][j] = matrix[i-1][j-1] + prefixSum[i-1][j] + prefixSum[i][j-1] - prefixSum[i-1][j-1]
# 枚举子矩阵并计算最大和
max_sum = float('-inf')
for i1 in range(1, N + 1):
for j1 in range(1, M + 1):
for i2 in range(i1, N + 1):
for j2 in range(j1, M + 1):
# 计算子矩阵 (i1, j1) 到 (i2, j2) 的和
submatrix_sum = prefixSum[i2][j2] - prefixSum[i1-1][j2] - prefixSum[i2][j1-1] + prefixSum[i1-1][j1-1]
max_sum = max(max_sum, submatrix_sum)
return max_sum
# 示例输入
N, M = 3, 4
matrix = [
[-3, 5, -1, 5],
[2, 4, -2, 4],
[-1, 3, -1, 3]
]
# 计算结果
print(max_submatrix_sum(N, M, matrix))