zoukankan      html  css  js  c++  java
  • 求一串数组的最大的子数组的和 孔祥安AND杨霏

    此题目最笨的方法就是,多用几个循环嵌套,依次求出子数组中数组个数为1到n的各个数组的和,然后比较找出其最大值,思路固然简单,但是从执行效率上来看,往往不是最好的。下面介绍一种相对上面的方法来说,优化一点的算法,只需遍历一遍。

    下面就以5个数的数组为例(5,-3,0,1,-2),下面就写出他们各个字数组的和的情况,为了便于以后的分析,就以倒三角的方式写出:

    5     -3     0     1     -2

       2     -3     1     -1

          2     -2     -1

             3     -4

                1

    由此可以看出数组中各个子数组的和的相对位置,其实可以看出他们和的位置都是很有规律的,假如把上面三角的各个数据用一个一维数组存储的话,一共需要n(n+1)/2个空间。下面就画出位置的相对情况(为了看着方便,就从1开始):

    1     2     3     4      5

       6     7     8      9

          10    11     12

             13    14

                15

       下面的三角与上面的三角,位置与元素是一一对应的,由此如果只循环依次的话,就可以利用位置找元素。1与2号的位置上的元素和在6号位置,1,2,3号位置元素的和在10号位置,所以求后面的的和可以,运用前面的求过的和结果。既然思路清楚了,接下来就是如何实现的问题。

       如果数组是5个数,那么最上层的就是五个数,第二层与第一层相差5,以后每次相差的数减1。这样的话就可以用计数的方法实现。用m记录当前层数,n记录当前层是否到头,然后利用当前的数组序列号与当前层的序号m,进行加法操作,然后再将和放入相应的位置,例如6号与7号位上的2与-3相加,但是要减去2号位置上的-3,结果是2放入放入10号位,这时的10号位是6加上此时的m值4。但是其中的集体的循环控制的细节如,如何判断结束,以及如何判断层的结束,以及每一层结束后,如何跳转,就不是问题的主要部分,就不写了。

  • 相关阅读:
    Codeforces Gym
    洛谷试炼场一句话题解
    优先队列板子
    BZOJ 3524 [POI2014] Couriers/洛谷3567(可持久化线段树)
    hdu 4417 Super Mario(可持久化线段树)
    poj 2559 Largest Rectangle in a Histogram (单调栈)
    zoj 4019 Schrödinger's Knapsack
    hdu 1521 排列组合(指数型生成函数板子)
    hdu 2072 单词数(普通型生成函数板子)
    RabbitMQ广播:direct模式
  • 原文地址:https://www.cnblogs.com/liyanzhui/p/3611207.html
Copyright © 2011-2022 走看看