51 nod 1051 最大子矩阵和
http://www.51nod.com/Challenge/Problem.html#problemId=1051
枚举两行,中间的压成一维,做一维最大子段和
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 501
int a[N][N];
long long b[N],f[N];
int main()
{
int n,m;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
long long ans=-1e15;
for(int i=1;i<=n;++i)
{
memset(b,0,sizeof(b));
for(int j=i;j<=n;++j)
{
for(int k=1;k<=m;++k) b[k]+=a[j][k];
for(int k=1;k<=m;++k) f[k]=-1e15;
for(int k=1;k<=m;++k)
{
f[k]=max(f[k-1]+b[k],b[k]);
ans=max(ans,f[k]);
}
}
}
printf("%lld",ans);
}