Algorithm


problem Link : https://onlinejudge.org/index.php?option=onlinejudge&Itemid=8&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 subrectangle with the largest sum is referred to as the maximal sub-rectangle. A sub-rectangle is any contiguous sub-array of size 1 × 1 or greater located within the whole array. As an example, the maximal sub-rectangle of the array: 0 −2 −7 0 9 2 −6 2 −4 1 −4 1 −1 8 0 −2 is in the lower-left-hand corner: 9 2 −4 1 −1 8 and has the sum of 15. Input The input consists of an N × N 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 N2 integers separated by white-space (newlines and spaces). These N2 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]. Output 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

Code Examples

#1 Code Example with C Programming

Code - C Programming

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector < vector<int>> dp(n,vector<int>(n));
    for(int i=0;i < n;i++)
    for(int j=0;j < n;j++){
        scanf("%d",&dp[i][j]);
        if(i) dp[i][j] += dp[i-1][j];
        if(j) dp[i][j] += dp[i][j-1];
        if(i && j) dp[i][j] -= dp[i-1][j-1];
    }
    int res = INT_MIN;
    for(int i=0;i<n;i++) for(int j=0;j < n;j++) // start coord
        for(int k=i;k < n;k++) for(int l=j;l < n;l++) // end coord
    {
        int rectSum = dp[k][l];
        if(i) rectSum -= dp[i-1][l];
        if(j) rectSum -= dp[k][j-1];
        if(i && j) rectSum += dp[i-1][j-1];
        res = max(res, rectSum);
    }
    printf("%d\n",res>;
}
 
Copy The Code & Try With Live Editor

Input

x
+
cmd
4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2

Output

x
+
cmd
15
Advertisements

Demonstration


UVA Online Judge solution - 108-Maximum Sum - UVA Online Judge solution in C,C++,java  

Previous
UVA Online Judge solution - 10790-How Many Points of Intersection - UVA Online Judge solution in C,C++,java
Next
UVA Online Judge solution -10801-Lift Hopping - UVA Online Judge solution in C,C++,java