[解题报告]108 Maximum Sum

 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 tex2html_wrap_inline33 or greater located within the whole array. As an example, the maximal sub-rectangle of the array:

displaymath35

is in the lower-left-hand corner:

displaymath37

and has the sum of 15.

Input and Output

The input consists of an tex2html_wrap_inline39 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 tex2html_wrap_inline43 integers separated by white-space (newlines and spaces). These tex2html_wrap_inline43 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



先建立一个二维数组存储输入的数,再建立一个二维数组存储存储所有可能的和,再在和数组里面找出最小数
PS:傻办法。。。

这一段为存储输入数
  for(i=1;i<=N;i++)
      for(j=1;j<=N;j++)
        scanf("%d",&array[i][j]);

存储和,和为改行第一列到该列的和,column_array[1][3]=array[0][3]+array[1][3]

 int column_array[105][105]={0};
    for(i=1;i<=N;i++)
      for(j=1;j<=N;j++)
        column_array[i][j]=column_array[i-1][j]+array[i][j];

穷举法得出结果

for(i=1;i<=N;i++)
      for(j=i;j<=N;j++)
      {
        sum=0;
        for(k=1;k<=N;k++)
        {
          sum+=column_array[j][k]-column_array[i-1][k];
          if(sum>max_sum) max_sum=sum;
          if(sum<0) sum=0;
        }
      }

AC代码

#include<stdio.h>
int main(){
  int N,i,j,k;
  int array[105][105];
  int max_sum=0,sum;
  while(scanf("%d",&N)!=EOF)
  {
    for(i=1;i<=N;i++)
      for(j=1;j<=N;j++)
        scanf("%d",&array[i][j]);
    int column_array[105][105]={0};
    for(i=1;i<=N;i++)
      for(j=1;j<=N;j++)
        column_array[i][j]=column_array[i-1][j]+array[i][j];
    for(i=1;i<=N;i++)
      for(j=i;j<=N;j++)
      {
        sum=0;
        for(k=1;k<=N;k++)
        {
          sum+=column_array[j][k]-column_array[i-1][k];
          if(sum>max_sum) max_sum=sum;
          if(sum<0) sum=0;
        }
      }
    printf("%d\n",max_sum);
  }
  return 0;
}
原文地址:https://www.cnblogs.com/TheLaughingMan/p/2917973.html