poj 1050 최대 서브 매트릭스 와

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
",maxx); } return 0; } /** 3 -2 10 20 100 -1 2 0 -2 -3 */

좋은 웹페이지 즐겨찾기