Chinaunix首页 | 论坛 | 博客
  • 博客访问: 474237
  • 博文数量: 117
  • 博客积分: 3195
  • 博客等级: 中校
  • 技术积分: 1156
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 01:44
文章分类

全部博文(117)

文章存档

2012年(5)

2011年(5)

2010年(46)

2009年(61)

我的朋友

分类:

2009-08-26 15:19:09

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

解题思路

题意:

求最大子矩阵和

 

思路:

a11  a12  a13

a21  a22  a23

a31  a32  a33

 

  如图,先求第一行最大子段和,再求第一行跟第二行合起来的最大子段和,如a21+a11, a22+a12, a23+a13  的最大子段和,再求第一到第三合起来的最大子段和,如a11+a21+a31,  a12+a22+a32, a13+a23+a33的最大子段和…..以此类推,直到求出整个矩阵的合起来的最大子段和,求出他们之中最大的那个和就是解.

 

 

 

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 103

int fun(int b[N], int n)
{
    int i, max, c;

    c = 0;
    max = 0;
    for(i=1; i<=n; i++)
    {
        if(c > 0)
            c = c+b[i];
        else c = b[i];
        if(max < c)
            max = c;
    }
    return max;
}

int main()
{
    int i, j, n, max, sum, k;
    int a[N][N], b[N];


    scanf("%d", &n);
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            scanf("%d", &a[i][j]);
    max = 0;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
            b[j] = 0;
        for(j=i;j <=n; j++)
        {
            for(k=1; k<=n; k++)
                b[k]+=a[j][k];
            sum = fun(b, n);
            if(max < sum)
                max = sum;
        }

    }
    printf("%d\n", max);
    getch();
    return 0;
}

阅读(6977) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~