/*To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8201 Accepted Submission(s): 3985 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 Source Greater New York 2001 */ #include<stdio.h> int a[110][110]; int main() { int n, i, j, stx1, stx2, k , max, sum; while(scanf("%d", &n) != EOF && n) { max = 0; for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); for( stx1 = 0; stx1 < n; stx1++) // 起始列 for( stx2 = stx1; stx2 < n; stx2++) // 终止列 { sum = 0; for(i = 0; i < n; i++) // 行变量 { for(k = 0, j = stx1; j <= stx2; j++)// 求当前行的 stx1 ~ stx2 列的 和 k += a[i][j]; sum += k; // 将当前行的和加入总和中 if( sum < 0) // 如果相加后小于0, 舍弃当前的 sum sum = 0; if( sum > max) // 记录全过程中的最大值 max = sum; } } printf("%d\n", max); } return 0; }
题意 :很明显了。
思路:知道一个矩阵是由四条边组成的,那么我们先限定子矩阵的两条竖线,然后再用DP求出在这2两条竖线内所能获得的最大和,如此将竖线从左到右遍历一边,用DP求出每个子矩阵所能获得的最大和,再记录其中最大的那个即为答案。