Hduoj1081!【DP】

/*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求出每个子矩阵所能获得的最大和,再记录其中最大的那个即为答案。

你可能感兴趣的:(c)