題目來源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=44
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.
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.
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.
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
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 }