这个题有树状数组的办法,这里我给出一种dp的办法,首先如果这个题目是一维的,那么应该都会做,要是多维的呢 ? 首先我们看一下一维的情况 比如 1 2 3 4 ans = 10,如果是二维的话我们就可以将第二维度压到第一维度, 3 4 5 6 加起来之后就是 4 5 6 7 ans = 22 以此类推就可以了。 取连续的子矩形才可以这么做的。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int INF = 1e9 + 7;
const int maxn = 105;
int n;
int a[maxn][maxn] = {0};
int sum[maxn] = {0};
int solve () {
int res = -INF;
int temp = 0;
for (int i = 1;i <= n; ++ i) {
temp += sum[i];
if (temp > res) res = temp;
if (temp < 0) temp = 0;
}
return res;
}
int main () {
ios_base :: sync_with_stdio(false);
while (cin >> n) {
int ans = -INF;
for (int i = 1;i <= n; ++ i) {
for (int j = 1;j <= n; ++ j) {
cin >> a[i][j];
}
}
for (int i = 1;i <= n; ++ i) {
memset (sum,0,sizeof (sum));
for (int j = i;j <= n; ++ j) {
for (int k = 1;k <= n; ++ k) {
sum[k] += a[j][k];
}
int temp = solve();
ans = max (ans,temp);
}
}
cout << ans << endl;
}
return 0;
}