Maximum Sum |
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
题意:给出一个方阵,这个这个方阵里面元素和最大的一个矩阵。
思路:最大连续子序列的升级版本,把原来的一维矩阵变成了二维的矩阵,需要转换思路,把二维矩阵看成一维数组,这个一维数组的元素是二维数组中同一列的元素相加。首先思路是枚举这个矩阵大小,再扫描。
#include<iostream> #include<cstring> using namespace std; int matrix[110][100],sum[110][110]; int main() { int n; cin>>n; int i,j,k; memset(matrix,0,sizeof(matrix)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>matrix[i][j]; matrix[i][j]=matrix[i][j]+matrix[i-1][j]; } } int maxsum=matrix[1][1]; for(i=0;i<=n;i++) { for(j=i;j<=n;j++) { int sum=0; for(k=1;k<=n;k++) { if(sum<0) sum=matrix[j][k]-matrix[i][k]; else if(i!=j) sum=matrix[j][k]-matrix[i][k]+sum; if(sum>maxsum&&sum!=0) maxsum=sum; } } } cout<<maxsum<<endl; return 0; }
[动态规划]UVA108 - Maximum Sum,布布扣,bubuko.com
原文:http://blog.csdn.net/zju_ziqin/article/details/23470397