zoukankan      html  css  js  c++  java
  • 最大子矩阵和

    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

    DP 求最大和子矩阵 , 可以用最大和连续子序列的思路解 .

    首先 , 读数据的时候 a[i][j] 为前 i 行数据的第 j 个数的和 , 当求第 p 行到第 q 行之间宽为 p-q+1 的最大和矩阵的时候, 就以 p 行和 q 行之间的同一列的数字的和作为一个数列的元素 , 然后 DP 求这个数列的最大和连续子序列 , 就是第p 行到第 q 行之间宽为 p-q+1 的最大和矩阵 .

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int INF=999999999;
    int n,m;
    int d[110][110];
    int s[110];
    int main(){
        int i,j,k,t;
        while(scanf("%d",&n)!=EOF){
            for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&d[i][j]);
            m=-INF;
            for(i=1;i<=n;i++){
                memset(s,0,sizeof(s));
                for(j=i;j<=n;j++){
                    t=0;
                    for(k=1;k<=n;k++){
                        s[k]+=d[j][k];
                        if(t<=0) t=s[k];
                        else t+=s[k];
                        if(t>m)m=t;
                    }
                }
            }
            printf("%d
    ",m);
        }
    return 0;
    }
    View Code
  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/demodemo/p/4732558.html
Copyright © 2011-2022 走看看