题意:给一个二维矩阵,求最大的子矩阵和。
分析:以行列中的其中一维做前缀和,枚举这一维的起点和终点然后遍历另一维即时更新最大和就可以了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 105;
int main()
{
int n;
int a[N][N];
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
int k;
scanf("%d",&k);
a[i][j]=a[i-1][j]+k; //做第一维的前缀和
}
}
int ans=0;
for(int i=1;i<=n;++i)
{
for(int j=i;j<=n;++j)
{
int sum=0;
for(int k=1;k<=n;++k)
{
int tot=a[j][k]-a[i-1][k];
sum+=tot;
if (sum<0) sum=0;
ans=max(ans,sum);
}
}
}
printf("%d\n",ans);
}
return 0;
}