zoukankan      html  css  js  c++  java
  • ZOJ 1074 To the Max(DP 最大子矩阵和)

    To the Max

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    Problem

    Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 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.

    The input consists of an N x 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.

    Input

    4
    0 -2 -7 0 9 2 -6 2
    -4 1 -4 1 -1
    8 0 -2

    Output

    15 

    代码如下:

     1 # include<stdio.h>
     2 # include<string.h>
     3 # define N 101
     4 int main(){
     5     int a[N][N],b[N];
     6     int n,i,j,k;
     7     while(scanf("%d",&n)!=EOF)
     8     {
     9         for(i=0;i<n;i++)
    10             for(j=0;j<n;j++)
    11                 scanf("%d",&a[i][j]);
    12             int max= -12345;
    13             for(i=0;i<n;i++)    //第i行到第j行的最大子矩阵和
    14             {
    15                 memset(b,0,sizeof(b));
    16                 for(j=i;j<n;j++)
    17                 {
    18                     int sum=0;
    19                     for(k=0;k<n;k++)
    20                     {
    21                         b[k] += a[j][k];
    22                         sum += b[k];
    23                         if(sum<0)  sum=b[k];
    24                         if(sum>max)  max=sum;
    25                     }
    26                 }
    27             }
    28             printf("%d
    ",max);
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    PAT 1010. 一元多项式求导 (25)
    PAT 1009. 说反话 (20) JAVA
    PAT 1009. 说反话 (20)
    PAT 1007. 素数对猜想 (20)
    POJ 2752 Seek the Name, Seek the Fame KMP
    POJ 2406 Power Strings KMP
    ZOJ3811 Untrusted Patrol
    Codeforces Round #265 (Div. 2) 题解
    Topcoder SRM632 DIV2 解题报告
    Topcoder SRM631 DIV2 解题报告
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3234767.html
Copyright © 2011-2022 走看看