UV 108, uva108
Source: https://uva.onlinejudge.org/index.php? Option = com_onlinejudge & Itemid = 8 & category = 3 & page = show_problem & problem = 44
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-dimenstmarray 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 asMaximal 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 integerNOn a line by itself indicating the size of the square two dimen1_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 .).NMay 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
40 -2 -7 0 9 2 -6 2-4 1 -4 1 -18 0 -2
Sample Output
15
Solution:
Question: Give a matrix of n * n and find the maximum value of the sum of the Child matrices in it.
The maximum continuous subsequence is applied. The sequence is one-dimensional and the matrix is two-dimensional. Therefore, we can convert the matrix into one-dimensional computation.
That is, the merge of several consecutive rows of the enumeration matrix, which is converted to one-dimensional. Then, we can use the maximum subsequence algorithm to update the maximum value.
Code:
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 }