zoukankan      html  css  js  c++  java
  • 集训第五周动态规划 F题 最大子矩阵和

    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

    这道题其实就是求最大子段和,需要把原题数据变化一下,例如
    0 -2 -7 0 
    9 2 -6 2 
    -4 1 -4 1 
    -1 8 0 -2 
    这个矩阵我选择的是
    9 2
    -4 1
    -1 8
    那么我还可以把这个选择过程看待为求数组 4 11 -10 1 的最大子段和,很显然是选择4 11,答案为15
    那么4 11 -10 1是怎么来的呢,是我把2 3 4行数组组合成一个数组得来的
    那么这道题的解法就出来了,不断枚举行区间,得到一个新数组,然后求最大子段和

    #include"iostream"
    #include"cstring"
    using namespace std;
    const int maxn=110;
    int b[maxn],a[maxn][maxn];
    int n;
    
    void Init()
    {
        int t;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cin>>t;
                a[i][j]=a[i-1][j]+t;
            }
        }
    }
    
    int main()
    {
        while(cin>>n)
        {
         Init();
         int sum,ans,temp;
         sum=0;
         ans=-1000000000;
         int c=1;
         for(int i=1;i<=n;i++)
         for(int j=i;j<=n;j++)
         {
         sum=0;
         for(int k=1;k<=n;k++)
         {
             temp=a[j][k]-a[i-1][k];
             sum+=temp;
             if(sum>ans)
             {
                 ans=sum;
             }
             if(sum<0)
             {
                 sum=0;
             }
         }
         }
          cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4725423.html
Copyright © 2011-2022 走看看