题目链接:Acwing 126.最大的和
给定一个包含整数的二维矩阵,子矩形是位于整个阵列内的任何大小为1 * 1或更大的连续子阵列。
矩形的总和是该矩形中所有元素的总和。
在这个问题中,具有最大和的子矩形被称为最大子矩形。
例如,下列数组:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩形为:
9 2
-4 1
-1 8
它拥有最大和15。
分析:
对列求前缀和,枚举上下界,在上下界包围的区域中,按一维求连续子序列和的方法求即可
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int a[N][N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
a[i][j]+=a[i-1][j];
}
}
int res=INT_MIN;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int sum=0;
for(int k=1;k<=n;k++){
sum=max(sum,0)+a[j][k]-a[i-1][k];
res=max(res,sum);
}
}
}
cout<<res<<endl;
}