**************推荐大牛的博文**************
http://www.matrix67.com/blog/archives/276
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
const int size = 101;
int Max,sum;
int N,i,j,k,val,a[size][size];
while (scanf("%d",&N)!=EOF)
{
memset(a,0,sizeof(a));
Max = -128;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
scanf("%d",&val);
a[i][j]+=a[i][j-1]+val;//a[i][j]表示第i行前j个数之和
}
for(i=1;i<=N;i++)
for (j=i;j<=N;j++)
for(sum = 0,k=1;k<=N;k++)
{
//a[k][j]-a[k][i-1]表示第k行第j列与第i列之间的数
sum=(sum>0?sum:0)+a[k][j]-a[k][i-1];
if(sum>Max)
Max = sum;
}
printf("%d\n",Max);
}
}