分析: 对于此题,首先可以想到的有前缀和,这个题的关键也是前缀和,但是怎么设计这个前缀和是一个好问题。
通常我们所用的前缀和大多都是在一维数组上,可以通过一维数组中的前缀和来求得在一维数组上求一个字段,且使字段的和最大这个问题。推广到二维数组,二维数组中记录的是所在列的前缀和(一定要参照代码理解)。然后通过和一维数组求最大和字段类似的方法,延伸到二维数组(从列上可以直观的看出)。
#include <iostream>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int res[105][105]; //res数组中记录的是列上的前缀和 用的非常好,很值得学习
int main()
{
memset(res,0,sizeof res);
int n;cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int t;cin>>t;
res[i][j]=res[i-1][j]+t; //仔细看实现过程 很重要
}
}
int sum=0,maxa=-inf;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
sum=0;
for(int k=1;k<=n;k++)
{
sum+=res[j][k]-res[i-1][k];
if(sum<0) sum=0;
maxa=max(sum,maxa);
}
}
}
cout<<maxa<<endl;
return 0;
}