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