zoukankan      html  css  js  c++  java
  • NUC1157 To the Max【最大子段和+DP】

    To the Max

    时间限制: 1000ms 内存限制: 65536KB

    通过次数: 1总提交次数: 1

    问题描述

    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.
    输入描述
    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 the sum of the maximal sub-rectangle.
    样例输入
    4
    0 -2 -7 0 9 2 -6 2
    -4 1 -4  1 -1
    
    8  0 -2
    
    样例输出
    15
    
    来源
    Greater New York 2001



    问题分析:(略)

    这个问题和《UVALive2288 POJ1050 HDU1081 ZOJ1074 To The Max【最大子段和+DP】》是同一个问题,代码直接用就AC了。

    程序说明:参见参考链接。

    参考链接:UVALive2288 POJ1050 HDU1081 ZOJ1074 To The Max【最大子段和+DP】

    题记:程序做多了,不定哪天遇见似曾相识的。

    AC的C++程序如下:

    /* UVALive2288 POJ1050 HDU1081 ZOJ1074 To The Max */
    
    #include <iostream>
    #include <limits.h>
    #include <string.h>
    
    using namespace std;
    
    const int N = 100;
    int a[N][N], b[N];
    
    int main()
    {
        int n, maxval;
    
        while(cin >> n) {
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    cin >> a[i][j];
    
            maxval = INT_MIN;
            for(int i=0; i<n; i++) {
                memset(b, 0, sizeof(b));
    
                for(int j=i; j<n; j++) {
                    int sum = 0;
                    for(int k=0; k<n; k++) {
                        b[k] += a[j][k];
    
                        if(sum + b[k] > 0)
                            sum += b[k];
                        else
                            sum = b[k];
    
                        maxval = max(maxval, sum);
                    }
                }
            }
    
            cout << maxval << endl;
        }
    
        return 0;
    }



  • 相关阅读:
    udp和tcp
    以查询代替临时变量
    memcached内存管理
    设计模式适配器模式
    排序算法
    防止表单重复提交
    php的引用
    按位与,按位异或,按位取反
    git常用操作
    http
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563655.html
Copyright © 2011-2022 走看看