AcWing 126. 最大的和
原题链接
简单
作者:
Hustle
,
2021-06-03 13:32:49
,
所有人可见
,
阅读 278
仅代码+注释:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
int s[N][N]; // 将所有列的和用前缀和处理
int main() {
cin >> n;
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= n; ++ j) {
int x;
cin >> x;
s[i][j] = s[i - 1][j] + x;
}
int res = -200; // 因为存在负值故将答案初始化为一个较大的负值来进行更新
for (int i = 1; i <= n; ++ i) // 子矩阵的上边界
for (int j = i; j <= n; ++ j) { // 子矩阵的下边界
int f = 0; // 不用另开一个数组,只需将上一次的f记录下来即可
for (int k = 1; k <= n; ++ k) {
// 将子矩阵中的所有列看作一行(用前缀和压缩),故即遍历列,将所有列遍历完的最大的和即为答案
int w = s[j][k] - s[i - 1][k]; // 第k列的和
f = max(0, f) + w; // 子矩阵到第k列的最大和
res = max(res, f); // 更新最大值
}
}
cout << res << endl;
return 0;
}