码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 108 - Maximum Sum(最大连续子序列)

时间:2015-12-15 22:26:32      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=44

 

 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 技术分享 or greater located within the whole array. As an example, the maximal sub-rectangle of the array:

 

技术分享

 

 

 

is in the lower-left-hand corner:

 

技术分享

 

 

 

and has the sum of 15.

 

 

 

Input and Output

 

The input consists of an 技术分享 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 技术分享 integers separated by white-space (newlines and spaces). These 技术分享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

解题思路:

题意:给出n*n的矩阵,求出里面子矩阵的和的最大值。

最大连续子序列的应用,序列是一维的,矩阵是二维的,所以我们可以把矩阵转换为一维的来算。

也就是枚举矩阵的连续几行的合并,这样就转换为一维的了,再用最大子序列的算法去求,更新最大值就可以了。

代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int table[100][100];
 6 int sum[100];
 7 int N;
 8 
 9 int max_continuous_sum()
10 {
11     int maxs=0,s=0;
12     for(int i=0; i<N; i++)
13     {
14         if(s>=0) s+=sum[i];
15         else s=sum[i];
16         maxs = maxs>s ? maxs : s;
17     }
18     return maxs;
19 }
20 int main()
21 {
22     cin >> N;
23     int maxsum=0;
24     int tmp;
25     for(int i=0; i<N; i++)
26     {
27         for(int j=0; j<N; j++)
28         {
29             cin >> table[i][j];
30             sum[j]=table[i][j];
31         }
32         tmp = max_continuous_sum();
33         maxsum = maxsum>tmp ? maxsum : tmp;
34         for(int j=i-1; j>=0; j--)
35         {
36             for(int k=0; k<N; k++)
37                 sum[k]+=table[j][k];
38             tmp = max_continuous_sum();
39             maxsum = maxsum>tmp ? maxsum : tmp;
40         }
41     }
42     cout << maxsum << endl;
43     return 0;
44 }

 

UVa 108 - Maximum Sum(最大连续子序列)

标签:

原文地址:http://www.cnblogs.com/zpfbuaa/p/5049457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!