zoukankan      html  css  js  c++  java
  • [HDU 1003] Max Sum

    一道很老的题目了,题解也很多,我比较智障,以前勉强做出来了,有一天看见了,又做不出来了。写一篇题解稍微强化下。

    题目大意:

    给N个数 1~1000000 ,有正有负,判断里面连续最长的和是多少,并且是从第几个加到第几个数。

    如果题目中的N小一点,比如只有1000或者10000的话,很容易就可以用前缀和的暴力平方复杂度过去。然而,如果N比较大的话,像这题。就只能用O(n)的优化的算法。也就是只扫一遍。

    首先思考,比如我的数列是 5 6 -1 3 4 这样,要求和最大。那么我们很明显,前两个数字会被算进去,因为都是正数,加上去一定更大。然后遇到了负数-1,这个时候,前面的数字和 sum 到底要不要加上-1,似乎要关系到后面的数字的情况,比较麻烦。实际上细细的思考以后,发现如果遇到了一个数,情况只有两种:

    1. 前面的和,加上了当前的数字,会得到比只有当前数字更好的情况。

    2. 当前数字不加上前面的sum,sum等于当前数字,结果更加大。

    如果碰到了第二种情况,我们要更新记录起点终点,也就是说,前面的和没有我们现在考虑的大。

    如果碰到第一种情况,我们只需要加上当前的数字,也就是说结果只能更加好。

    主体情况就是:

     开始时 :

     ans = a[1]; ans_begin = ans_end = temp = 1;

    //

    接下来:

    for(int i = 2 ; i <= n ; i++){

      if(a[i] > sum + a[i]){

         temp = i;

         sum = a[i];

      }else{

        sum += a[i];

      }

      if(sum > ans){

        ans = sum;

        ans_begin = temp;

        ans_end = i;

      }

    }

    基本思路如上。

  • 相关阅读:
    Unity项目
    Unity基本操作
    博客园自定义主题样式
    明解C语言
    C指针基础知识
    排序算法
    session理解与总结【session原理、应用、与cookie区别】
    cookie理解与实践【实现简单登录以及自动登录功能】
    【数据结构与算法】双指针思想——数组首部或尾部同向遍历
    【数据结构与算法】双指针思想——首尾双向遍历
  • 原文地址:https://www.cnblogs.com/ticsmtc/p/5560927.html
Copyright © 2011-2022 走看看