思路:
若枚举每一个点,再进行加和,复杂度:o(n^4);
所以只考虑枚举边界,即上边界,下边界,以及有边界,复杂度降低为o(n^3);
last=max(last,0)+a[j][k]-a[i-1][k];
这段代码不是完全理解,埋坑,懂了回来填坑
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=110;
int a[N][N];
int main()
{
int n;
cin>>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=-1e9;//初始化答案
for(int i=1;i<=n;i++)//上边界
for(int j=1;j<=n;j++)//下边界
{
int last=0;//因为前缀和的,是以列为单位枚举的,所以每枚举一次右边界,就要重新初始化last=0
for(int k=1;k<=n;k++)//枚举右边界
{
last=max(last,0)+a[j][k]-a[i-1][k];
res=max(res,last);//res不断递增更新
}
}
cout<<res<<endl;
return 0;
}