• 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 }
  • 相关阅读:
    Merge Intervals
    Merge k Sorted Lists
    Sqrt(x)
    First Missing Positive
    Construct Binary Tree from Inorder and Postorder Traversal
    Construct Binary Tree from Preorder and Inorder Traversal
    Distinct Subsequences
    Reverse Nodes in k-Group
    Jump Game II
    Jump Game
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3234767.html
Copyright © 2020-2023  润新知