Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
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.
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.
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
思路:78ms过题,应该是数据比较水吧,补一篇博文;
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define max_n 110
using namespace std;
typedef long long LL;
int a[max_n][max_n],c[max_n][max_n];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&c[i][j]);
int ans=0,sum=0,maxn=-100001200;
for(int i=1;i<=n;i++)
{
sum=0;
for(int j=1;j<=n;j++)
{
for(int p=1;p<=i;p++)
{
sum+=c[p][j];
}
a[i][j]=sum;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int p=0;p<i;p++)
{
for(int u=0;u<j;u++)
{
ans=a[i][j]-a[p][j]-a[i][u]+a[p][u];//减的有重叠部分
maxn=max(maxn,ans);
}
}
}
}
printf("%d\n",maxn);
}
return 0;
}