求每个纵列的前缀和然后去遍历每个纵列。对于某一行来说可以使用在一维求最大序列和的做法,如果前一个最大总和小于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;
}