求每个纵列的前缀和然后去遍历每个纵列。对于某一行来说可以使用在一维求最大序列和的做法,如果前一个最大总和小于0的话就直接取自身,如果大于0的话就加上。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
int a[maxn][maxn];
int sum[maxn][maxn];
int main() {
int N;
cin>>N;
for (int i=1;i<=N;i++) {
for (int j=1;j<=N;j++) {
cin>>a[i][j];
sum[i][j] = sum[i-1][j]+a[i][j];
}
}
int res = INT_MIN;
for (int i=1;i<=N;i++) {
for (int j=i;j<=N;j++) {
int last = 0;
for (int k=1;k<=N;k++) {
last = max(last, 0) + sum[j][k] - sum[i - 1][k];
res = max(last, res);
}
}
}
cout<<res;
return 0;
}

京公网安备 11010502036488号