程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVa 108,uva108

UVa 108,uva108

編輯:C++入門知識

UVa 108,uva108


題目來源: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 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_inline43integers 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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved