To The Max

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5023    Accepted Submission(s): 2384


Problem Description

 

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.

 

 


Input

 

The input consists of an N x N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N 2 integers separated by whitespace (spaces and newlines). These are the N 2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].

 

 


Output

 

Output the sum of the maximal sub-rectangle.

 

 


Sample Input

 

4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2

 

 


Sample Output

 

15
 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[101][101],max[101];
 4 int main()
 5 {
 6     int maxsum,r,c,m,n,i,j;
 7     while(scanf("%d",&n)!=EOF)
 8     {
 9         for(i=1;i<=n;++i)
10             for(j=1;j<=n;++j)
11             {
12                 scanf("%d",&a[i][j]);
13                 a[i][j]+=a[i-1][j];                                    
14             }
15         maxsum=a[1][1];
16         for(i=0;i<n;++i)//注意这里技巧,从零开始;
17         {
18             for(j=i+1;j<=n;++j)
19             {
20                 memset(max,0,sizeof(max));
21                 for(m=1;m<=n;++m)
22                 {
23                     if(max[m-1]>=0)
24                         max[m]=max[m-1]+a[j][m]-a[i][m];//a[j][m]-a[i][m]即为第m列中第i+1行到第j行之和
25                     else
26                         max[m]=a[j][m]-a[i][m];
27                     if(maxsum<max[m])
28                         maxsum=max[m];
29                 }
30             }
31         }
32         printf("%d\n",maxsum);
33     }
34     return 0;
35 }

 

 

posted on 2012-06-04 12:43  可笑痴狂  阅读(581)  评论(0编辑  收藏  举报