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;

      }

    }

    基本思路如上。

  • 相关阅读:
    [matlab] 8.蚁群算法解决TSP问题
    [python] A*算法基于栅格地图的全局路径规划
    [python] RRT快速拓展随机树
    [matlab] 7.快速搜索随机树(RRT---Rapidly-exploring Random Trees) 路径规划
    [matlab] 6.粒子群优化算法
    [matlab] 5.字符运算与微积分
    [matlab] 4.M函数
    [matlab] 3.矩阵
    [python] 解决pip install download速度过慢问题 更换豆瓣源
    [matlab] 1.拟合
  • 原文地址:https://www.cnblogs.com/ticsmtc/p/5560927.html
Copyright © 2011-2022 走看看