• POJ1050 To the Max


    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 46562   Accepted: 24627

    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

    Source

    二维的求连续序列和。和一维思路基本一样。枚举左右列数边界,然后从上到下逐行累计限制范围内的和,小于0就重置。

     1 /**/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 const int mxn=125;
     9 int a[mxn][mxn];
    10 int n;
    11 int sum;
    12 int ans=0;
    13 int main(){
    14     int i,j;
    15     scanf("%d",&n);
    16     for(i=1;i<=n;i++)
    17       for(j=1;j<=n;j++){
    18           scanf("%d",&a[i][j]);
    19           a[i][j]+=a[i][j-1];
    20       }
    21     for(i=0;i<n;i++)
    22      for(j=i;j<=n;j++){
    23          sum=0;
    24          for(int k=0;k<=n;k++){
    25              sum+=a[k][j]-a[k][i];
    26              if(sum<0)sum=0;
    27              ans=max(ans,sum);
    28          }
    29      }
    30     printf("%d
    ",ans);
    31 }
  • 相关阅读:
    我们的CPU遭到攻击[LOJ558]
    历史[ZJOI2018]
    字符串[LOJ6517]
    奥运公交[LOJ3255]
    BLO-Blockade[POI2008]
    压力[BJOI2013]
    Earthquake[USACO01OPEN]
    暴力写挂[CTSC2018]
    极简教程:数据结构与算法(二)
    DllRegisterServer的调用失败的问题解决方法
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5719439.html
Copyright © 2020-2023  润新知