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-70 92-62 -41-41 -180-2 isin the lower left corner: 92 -41 -18 and has a sum of 15. 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 as100. 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-70 92-62 -41-41 -180-2 Sample Output 15
提交代码如下(仅供参考):
#include <stdio.h> #define MAX 130 int maxSum(int b[], int n) ...{ int max = b[0]; int sum =0; for(int i =0; i < n; ++i) ...{ if(sum <0) sum = b[i]; else sum += b[i]; if(sum > max) max = sum; } return max; } int solve(int a[][MAX], int n) ...{ int b[MAX]; int i,j,k,sum,tmp; sum = a[0][0]; for(i =0; i < n; ++i) ...{ for(k =0; k < n; ++k) b[k] =0; for(j = i; j < n; ++j) ...{ for(k =0; k < n; ++k) b[k] += a[j][k]; if(sum < (tmp = maxSum(b,n)) ) sum = tmp; } } return sum; } int main() ...{ int arr[MAX][MAX]; int i,j,n; while(scanf("%d",&n)!=EOF) ...{ for(i =0; i < n; ++i) for(j =0; j < n; ++j) scanf("%d",&arr[i][j]); printf("%d ",solve(arr,n)); } return0; }
int maxSum(int b[], int n) ...{ int max = b[0]; int sum =0; for(int i =0; i < n; ++i) ...{ if(sum <0) sum = b[i]; else sum += b[i]; if(sum > max) max = sum; } return max; }