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;

      }

    }

    基本思路如上。

  • 相关阅读:
    10.14 正睿做题笔记
    斯坦纳树
    django+uwsgi+nginx 前后端分离部署配置
    pandas 取 groupby 后每个分组的前 N 行
    使用 Java SDK 获取 MaxCompute 的表结构并写入到 Excel 中
    PPYOLO模型参数配置理解
    分子表面计算库MSMS的linux安装教程
    使用Python的seaborn画热力图heatmap以及将两个矩阵合并画热图的方法
    常见图片格式分析-bmp,png
    BUUOJ-Misc刷题笔记
  • 原文地址:https://www.cnblogs.com/ticsmtc/p/5560927.html
Copyright © 2011-2022 走看看