Given a two-dimenstmarray of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*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 * 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-dimen=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

The largest submatrix. First, a row of columns is very simple to find the largest vertex and we want to convert the matrix into a row of columns, that is, to get the sum from top to bottom during input, map [I] [j] indicates the sum of numbers from top to bottom in column J. In this way, a column is converted into a vertex, and then dual, cyclic, the largest sum of the numbers in the first row of column j in any row is the final largest sum.

# Include <iostream> # include <stdio. h> using namespace std; int map [105] [105]; int main () {int n, I, j, k, sum, x, max; while (scanf ("% d", & n )! = EOF) {for (I = 0; I <n; I ++) for (j = 0; j <n; j ++) {scanf ("% d ", & x); map [I] [j] = map [I-1] [j] + x;} max =-0x4f4f4f4f; for (I = 0; I <n; I ++) for (j = I; j <n; j ++) {sum = 0; for (k = 0; k <n; k ++) {sum + = map [j] [k]-map [I] [k]; if (sum <0) // if it is smaller than 0, it is equivalent to not needing to be retrieved, remove # include <iostream> # include <stdio. h> using namespace std; int map [105] [105]; int main () {int n, I, j, k, sum, x, max; while (scanf ("% d", & n )! = EOF) {for (I = 0; I <n; I ++) for (j = 0; j <n; j ++) {scanf ("% d ", & x); map [I] [j] = map [I-1] [j] + x;} max =-0x4f4f4f4f; for (I = 0; I <n; I ++) for (j = I; j <n; j ++) {sum = 0; for (k = 0; k <n; k ++) {sum + = map [j] [k]-map [I] [k]; if (sum <0) // if it is smaller than 0, it is equivalent to removing it directly.

Sum = 0;

If (sum> max)

Max = sum;

}

}

Printf ("% d \ n", max );

}

Return 0;

}

Sum = 0;

If (sum> max)

Max = sum;

}

}

Printf ("% d \ n", max );

}

Return 0;

}