zoukankan      html  css  js  c++  java
  • 01复杂度2 Maximum Subsequence Sum

      这道题和前面的“最大子列和”例题非常相似,但难点在于除了输出最大子列和这个数值之外,还需要输出该最大子列的首末两个数值。如何确定这个最大子列的首末位置是关键。

      按照前文所述的“在线处理”方法,找到目标子列的末尾位置比较简单,因为每当ThisSum大于原有的MaxSum进行“更新”时,最大子列也在“生长”到当前数值,当前累加入的这个数就是目前最大子列的末尾数。所以只需在ThisSum新赋值给MaxSum时,将MaxIndex(用于储存最大子列末位置的下标数值)更新为当下加进来数的下标i。

      那么如何找到最大子列的首位置呢?我用的方法是关注每次ThisSum重置为0时的点。因为ThisSum只会在自身数值小于0时进行重置,那么此刻它累加的、使自己小于0的这个数,一定不可能是最大子列和的开始值。那最大子列和的开始值只可能从这个数之后产生,且只要之后的那一个数是正数,它就有可能是最大子列和的起始位置数值(只要是正数后面都有越加越大的可能),所以我将(i + 1)位置设为tmpMinIndex(可能的最大子列起始下标)。何时tmpMinIndex最终确认为MinIndex呢,是在当ThisSum更新为MaxSum时,因为更新的这个ThisSum就是从tmpMinIndex那个位置开始从0累加的,它既然能成为MaxSum了说明它从0开始(tmpMinIndex位置)加的这一连串就是当下最大子列,所以这时tmpMinIndex就是整个序列中这个最大子列的MinIndex了。

      想通之后只要在前一题代码基础上加几行即可:

    void MaxSubSumWithIndex(int List[], int K)
    {
        int i;
        int MaxIndex = 0, MinIndex = 0, tmpMinIndex = 0;
        int ThisSum = 0, MaxSum = -1;
        for(i = 0; i < K; i++){
            ThisSum += List[i];
            if (ThisSum > MaxSum){
                MaxSum = ThisSum;
                MaxIndex = i;
                MinIndex = tmpMinIndex;
            }else if(ThisSum < 0){
                ThisSum = 0;
                tmpMinIndex = i + 1;
            }
        }
        if(MaxSum >= 0)
          printf("%d %d %d\n", MaxSum, List[MinIndex], List[MaxIndex]);
        else
          printf("0 %d %d\n", List[0], List[K - 1]);
    }

      这里需特别注意输出部分,因为题目中说“If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.”(当输入的这K个数全为负时,输出的最大子列和应为0,并输出整个输入序列的首尾两个数)。那就需要对应MaxSum >= 0和MaxSum < 0的情况,之所以要把 = 0的情况放到前者,是因为 = 0可能是输入序列中有0有负的结果,比如输入6个数-2,0,-1,0,0,0。那最大子列和也是0但是显然不应输出题意要求的全为负情况下的首末两个数(-2和0)而是输出正常比较后的0和0(对应下标都为1)。

      这也涉及到和前一题不同的MaxSum初值问题,因为输入全为负的情况下,累加时ThisSum不断重置为0,MaxSum保持不变,最后直接进入输出的else情况,符合题意。

  • 相关阅读:
    P3853 [TJOI2007]路标设置
    P1182 数列分段`Section II`
    P1948 [USACO08JAN]电话线Telephone Lines
    P1541 乌龟棋
    P1005 矩阵取数游戏
    P4001 [BJOI2006]狼抓兔子
    Windows环境中Tomcat优化
    可视化GC日志工具
    垃圾回收器
    垃圾回收机制
  • 原文地址:https://www.cnblogs.com/biankun/p/8530813.html
Copyright © 2011-2022 走看看