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
HINT
大意:用一个数组表示从i行到j行的第k个元素的值的和。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int a[150][150]; int n,m; scanf("%d",&n); for(int i = 1; i <= n ;i++){ for(int j = 1; j <= n ;j++){ scanf("%d",&m); a[i][j] = a[i-1][j] + m; } } int max1 = 0; int sum; for(int i = 1; i <= n ;i++){ for(int j = i+1 ; j<= n ;j++){ int sum = 0; for(int k = 1; k <= n;k++){ int temp = a[j][k] - a[i][k]; sum += temp; if(sum < 0) sum = 0; if(sum > max1) max1 = sum; } } } printf("%d",max1); return 0; }