Description
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
Input
Output
Sample Input
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
Sample Output
15
Source
#include<stdio.h>
#include<string.h>
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
int array[105];
int sum[105][105];
int num[105][105];
int main()
{
int n;
while(~scanf("%d",&n))
{
sum[0][0]=0;
array[0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&num[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum[i][j]=sum[i-1][j]+num[i][j];
int ans=-0x3f3f3f3f;
for(int up=1;up<=n;up++)
for(int down=up;down<=n;down++)
{
for(int i=1;i<=n;i++)
array[i]=array[i-1]+(sum[down][i]-sum[up-1][i]);
int mins=0;//保存1-(i-1)里面的最小值
for(int i=1;i<=n;i++)
{
ans=max(ans,array[i]-mins);
mins=min(mins,array[i]);
}
}
printf("%d\n",ans );
}
return 0;
}