http://acm.pku.edu.cn/JudgeOnline/problem?id=1050 AC
#include<stdio.h>
#include<string.h>
#define Max(a,b) a>b?a:b;
#define Min(a,b) a<b?a:b;
const int MAX=99999999;
const int MIN=-99999999;
int n,final_max=MIN;
int m[101][101],c[101],opt[101];
void dp();
void MaxLong();
int main()
{
memset(c,0,sizeof(c));
scanf("%d",&n);
for(int n1=0;n1<n;n1++)
{
for(int n2=0;n2<n;n2++)
{
scanf("%d",&m[n1][n2]);
}
}
dp();
printf("%d",final_max);
return 0;
}
void dp()
{
for(int i=1;i<=n;i++)
{
int s=0;
for(int j=1;j<=n+1-i;j++)
{
for(int k=s;k<i+s;k++)
{
for(int p=0;p<n;p++)
{
c[p]=c[p]+m[k][p];
}
}
s++;
MaxLong();
memset(c,0,sizeof(c));
}
}
}
void MaxLong()
{
int in_max=MIN;
opt[0]=c[0];
for(int i=1;i<n;i++)
{
if(opt[i-1]>0)
{
opt[i]=opt[i-1]+c[i];
}
else
{
opt[i]=c[i];
}
in_max=Max(in_max,opt[i]);
}
final_max=Max(final_max,in_max);
}
#include<stdio.h>
#include<string.h>
#define Max(a,b) a>b?a:b;
#define Min(a,b) a<b?a:b;
const int MAX=99999999;
const int MIN=-99999999;
int n,final_max=MIN;
int m[101][101],c[101],opt[101];
void dp();
void MaxLong();
int main()
{
memset(c,0,sizeof(c));
scanf("%d",&n);
for(int n1=0;n1<n;n1++)
{
for(int n2=0;n2<n;n2++)
{
scanf("%d",&m[n1][n2]);
}
}
dp();
printf("%d",final_max);
return 0;
}
void dp()
{
for(int i=1;i<=n;i++)
{
int s=0;
for(int j=1;j<=n+1-i;j++)
{
for(int k=s;k<i+s;k++)
{
for(int p=0;p<n;p++)
{
c[p]=c[p]+m[k][p];
}
}
s++;
MaxLong();
memset(c,0,sizeof(c));
}
}
}
void MaxLong()
{
int in_max=MIN;
opt[0]=c[0];
for(int i=1;i<n;i++)
{
if(opt[i-1]>0)
{
opt[i]=opt[i-1]+c[i];
}
else
{
opt[i]=c[i];
}
in_max=Max(in_max,opt[i]);
}
final_max=Max(final_max,in_max);
}