[HDU 1003] Max Sum
Posted EqTStar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}
}
基本思路如上。
以上是关于[HDU 1003] Max Sum的主要内容,如果未能解决你的问题,请参考以下文章