poj1050 最大子矩陣和

life4711發表於2014-11-07

http://poj.org/problem?id=1050

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
/**
poj 1050  最大子矩陣和
http://blog.sina.com.cn/s/blog_695800d10100q6as.html
算是一類比較經典的問題了
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;

int n,maxx;
int temp[105],a[105][105];

int solve()
{
    int maxx=0,sum=0;
    for(int i=0; i<n; i++)
    {
        sum+=temp[i];
        if(sum<0)
            sum=0;
        maxx=max(maxx,sum);
    }
    return maxx;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                scanf("%d",&a[i][j]);
        maxx=-0xfffffff;
        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]+=a[j][k];
                int sum=solve();
                maxx=max(maxx,sum);
            }
        }
        printf("%d\n",maxx);
    }
    return 0;
}
/**
3
-2 10 20
100 -1 2
0 -2 -3
*/


相關文章