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

UVA 108 Maximum Sum(子矩陣最大和)

編輯:C++入門知識

 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  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 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.


Sample Input

4
0 -2 -7  0 9  2 -6  2
-4  1 -4  1 -1
8  0 -2
Sample Output

15題意:給定一個矩陣。要求出一個和最大的子矩陣之和。。


思路:和一維的求最大和子序列有點類似。不過這是二維的。直接暴力會超時。所以每次進行操作的時候。要把值保留下來。以備給後面使用。這樣可以大大減少所用的時間。。


代碼:


 

#include <stdio.h>
#include <string.h>
#include <limits.h>
int n, num[105][105], Max, he, sum[105];

void init() {
    Max = -INT_MAX;
    for (int i = 0; i < n ; i ++)
	for (int j = 0 ; j < n ; j ++)
	    scanf("%d", &num[i][j]);
}

int solve() {
    for (int i = 0; i < n ; i ++) {
	memset(sum, 0, sizeof(sum));
	for (int j = i; j < n; j ++) {
	    he = 0;
	    for (int k = 0; k < n; k ++) {
		sum[k] += num[j][k];
		if (he >= 0)//這步跟求最大子序列和一個原理。。如果加到是負數的時候,是會使總和減少的。所以直接從下一個位置開始作為起點。
		    he += sum[k];
		else
		    he = sum[k];
		if (Max < he)
		    Max = he;
	    }
	}
    }
    return Max;
}

int main() {
    while (~scanf("%d", &n)) {
	init();
	printf("%d\n", solve());
    }
    return 0;
}

 

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