码迷,mamicode.com
首页 > 其他好文 > 详细

URAL 1146. Maximum Sum(求最大子矩阵和)

时间:2015-02-08 21:58:04      阅读:308      评论:0      收藏:0      [点我收藏+]

标签:数学   ural   

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1146


1146. Maximum Sum

Time limit: 0.5 second
Memory limit: 64 MB
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 1 × 1 or greater located within the whole array.
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-hand corner and has the sum of 15.

Input

The input consists of an N × N array of integers. The input begins with a single positive integer Non a line by itself indicating the size of the square two dimensional array. This is followed by N 2integers separated by white-space (newlines and spaces). These N 2 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].

Output

The output is the sum of the maximal sub-rectangle.

Sample

input output
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
15

PS:

先把遍历,把每一行相加,在求最大子序列的和!有点暴力的味道

代码如下:

#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
int n;
int a[147][147], s[147];
int findd(int x, int y)
{
    memset(s, 0,sizeof(s));
    for(int i = 0; i < n; i++)//同一行相加
    {
        for(int j = x; j <= y; j++)
        {
            s[i] += a[i][j];
        }
    }
    int MAX = -INF, sum = 0;
    for(int i = 0; i < n; i++)//子序列
    {
        sum+=s[i];
        if(sum > MAX)
        {
            MAX = sum;
        }
        if(sum < 0)
            sum = 0;
    }
    return MAX;
}
int main()
{
    while(~scanf("%d",&n))
    {
        int maxx = -INF;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = i; j < n; j++)
            {
                int tt = findd(i, j);
                if(tt > maxx)
                {
                    maxx = tt;
                }
            }
        }
        printf("%d\n",maxx);
    }
    return 0;
}


URAL 1146. Maximum Sum(求最大子矩阵和)

标签:数学   ural   

原文地址:http://blog.csdn.net/u012860063/article/details/43646475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!