Hduoj1081!【DP】

来源:互联网 发布:铁路局通信段 知乎 编辑:程序博客网 时间:2024/06/10 09:36
/*To The MaxTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8201    Accepted Submission(s): 3985Problem DescriptionGiven 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 09 2 -6 2-4 1 -4 1-1 8 0 -2is in the lower left corner:9 2-4 1-1 8and has a sum of 15.InputThe 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].OutputOutput the sum of the maximal sub-rectangle.Sample Input40 -2 -7 0 9 2 -6 2-4 1 -4 1 -18 0 -2 Sample Output15 SourceGreater 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求出每个子矩阵所能获得的最大和,再记录其中最大的那个即为答案。

0 0
原创粉丝点击