UVA 108: Maximum Sum (solution)
Maximum Sum
Background
The Problem
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 / Output
The input consists of an NxN 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 N^2 integers separated by white-space (newlines and spaces). These N^2 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
SOLUTION: C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
##Solution: C++ Problem: http://onlinejudge-problems.blogspot.com.co/2016/04/uva-108-maximum-sum-solution.html | |
#include <iostream> | |
#include <cstdio> | |
#include <algorithm> | |
#include <cstring> | |
#include <string> | |
#include <cctype> | |
#include <stack> | |
#include <queue> | |
#include <list> | |
#include <vector> | |
#include <map> | |
#include <sstream> | |
#include <utility> | |
#include <set> | |
#include <math.h> | |
using namespace std; | |
#define Dif(i,j,k) (Table[i+k][j] - Table[i][j]) | |
#define MAXN 110 | |
int N, MAX; | |
int Table[MAXN][MAXN]; | |
void ReadCase() | |
{ | |
int i, j; | |
for(i = 1; i<=N; i++) | |
for(j = 0; j<N; j++) | |
scanf("%d",&Table[i][j]); | |
} | |
void Cal() | |
{ | |
int i, j, k, t; | |
for(i = 1; i<=N; i++) | |
{ | |
for(j = 0; j<N; j++) | |
Table[i][j] = Table[i][j] + Table[i-1][j]; | |
} | |
MAX = Table[1][0]; | |
for(k = 1; k<=N; k++) | |
{ | |
for(i = 0; i<=N-k; i++) | |
{ | |
for(t = 0, j = 0; j<N; j++) | |
{ | |
if(t>=0) | |
t+= Dif(i,j,k); | |
else | |
t = Dif(i,j,k); | |
if(t>MAX) | |
MAX = t; | |
} | |
} | |
} | |
printf("%d\n",MAX); | |
} | |
void FREE() | |
{ | |
int i, j; | |
for(i = 0; i<=N; i++) | |
for(j = 0; j<=N; j++) | |
Table[i][j] = 0; | |
} | |
int main() | |
{ | |
int f = 0; | |
while(scanf("%d",&N) == 1) | |
{ | |
if(f++) | |
FREE(); | |
ReadCase(); | |
Cal(); | |
} | |
return 0; | |
} |
0 comentarios: