题目链接
http://poj.org/problem?id=1050
分析
预处理出每个位置向上各数之和,枚举两行,求在此之间的最大矩形,转化为一维求最大子段和问题。
时间复杂度为 O ( n 3 ) O(n ^ 3) O(n3)。
AC代码
#include <cstdio>
inline int read() {
int num = 0, flag = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') flag = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return flag * num;
}
const int maxn = 105;
int mx[maxn][maxn];
int main() {
int n = read(), ans = 0;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) mx[i][j] = mx[i - 1][j] + read();
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; ++j) {
int sum = 0, mins = 0;
for (int k = 1; k <= n; ++k) {
sum += mx[j][k] - mx[i - 1][k];
if (sum - mins > ans) ans = sum - mins;
if (sum < mins) mins = sum;
}
}
printf("%d", ans);
return 0;
}