poj最大子矩阵

To the Max
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 51076 Accepted: 27026
Description

Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. 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. 
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 corner: 

9 2 
-4 1 
-1 8 
and has a 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 N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in 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

Output 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

题目大意:输入一个N*N的整数矩阵,包含正负数,从该矩阵中寻找一个子矩阵使其数之和最大,子矩阵最小可为1*1。

二维空间寻找子矩阵较复杂,可以先降到一维先考虑如何求得一维数组子段和最大。

求最大子段和:

int max_array(int a[],int n)

{

   int sum=0,max=-10000;

   for(int i=0;i<n;i++)

    {

       if(sum>0)            //如果到此为止和为正的话继续加入下一元素比较

        sum+=a[i];

       else                     //如果和为零或负值则进行剪枝,直接以下一元素作为字段头再开始

        sum=a[i];

       if(sum>max)       //记录每次的最大值并不断更新

         max=sum;

     }

return max;

}

接下来从最大子段为基础考虑最大子阵:

int max_rectangle(int n,int b[][101])

{

int temp[101];

int max=-10000;

for(int i=0;i<n;i++)

   {

     memset(temp,0,sizeof(temp));      //注意清空重置!

     for(int j=i;j<n;j++)

       {

          for(int k=0;k<n;k++)

                temp[k]+=b[j][k];               //将二维的数组相加压缩成一维的,找最大子段和

          if(max_array(k,temp)>max)

            max=max_array(k,temp);

        }

     }

return max;

}

猜你喜欢

转载自blog.csdn.net/slience_646898/article/details/80953737