Uva--108(贪心)

2014-07-27 14:28:12

 Maximum Sum 

Background

A problem that is simple to solve in one dimension is often much more difficult to solve in more than one dimension. Consider satisfying a boolean expression in conjunctive normal form in which each conjunct consists of exactly 3 disjuncts. This problem (3-SAT) is NP-complete. The problem 2-SAT is solved quite efficiently, however. In contrast, some problems belong to the same complexity class regardless of the dimensionality of the problem.

The Problem

Given a 2-dimensional array of positive and negative integers, find the sub-rectangle with the largest sum. 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. A sub-rectangle is any contiguous sub-array of size tex2html_wrap_inline33 or greater located within the whole array. As an example, the maximal sub-rectangle of the array:

displaymath35

 

is in the lower-left-hand corner:

displaymath37

 

and has the sum of 15.

Input and Output

The input consists of an tex2html_wrap_inline39 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 tex2html_wrap_inline43 integers separated by white-space (newlines and spaces). These tex2html_wrap_inline43 integers make up the array in row-major order (i.e., all numbers on the first row, left-to-right, then all numbers on 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].

The output is 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

思路:这题是求最大连续和的二维版,通过枚举上下界把二维转一维,然后就是求最大连续和的问题了,具体见代码。
 1 /*************************************************************************
 2     > File Name: o.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sat 26 Jul 2014 06:51:59 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 
16 int n,g[105][105],sumr[105][105],sumc[105][105];
17 
18 int main(){
19     scanf("%d",&n);
20     for(int i = 1; i <= n; ++i){
21         for(int j = 1; j <= n; ++j){
22             scanf("%d",&g[i][j]);
23             sumr[i][j] = sumr[i][j - 1] + g[i][j];
24             sumc[i][j] = sumc[i - 1][j] + g[i][j];
25         }
26     }
27     int ansmax = 0;
28     for(int i = 1; i <= n; ++i){
29         for(int j = i; j <= n; ++j){
30             int tmax = 0,tsum = 0;
31             for(int k = 1; k <= n; ++k){
32                 tsum += sumc[j][k] - sumc[i - 1][k];
33                 if(tsum < 0)
34                     tsum = 0;
35                 if(tsum > tmax)
36                     tmax = tsum;
37             }
38             ansmax = tmax > ansmax ? tmax : ansmax;
39         }
40     }
41     printf("%d\n",ansmax);
42     return 0;
43 }

 

 
posted @ 2014-07-27 14:31  Naturain  阅读(120)  评论(0编辑  收藏  举报