Max Sum
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
分析
题目要求求出一段数列中和最大的一段,并输出最大和与开始,结束的位置.
1.为了求出最大和,我们应该用一个max储存每一次比较得出的最大值,再用一个sum依次相加用以比较。
仔细考虑可以发现有以下三种情况:
①最大序列和当中存在负数,但是负数后面的所有数相加时>0;
②最大序列和从第一位开始碰到了负数,并终止,这种情况必然是后面的所有数相加<0;
③最大序列和并不从第一位开始,而是碰到某个数时,使得前面的序列相加和<0,且该负数后面的数相加的序列和大于
前面的序列,序列的起始点更改了。
2.需要考虑全是负数的情况
参考原贴及代码
代码
#include<iostream>
using namespace std;
int main(){
int t,n,num;
cin>>t;
int time=1;
while(t--){
cin>>n;
int sta,end;//起始点和终止点
int sum=0;
int max=-1000;//要输出的最大序列和
int tep=1;//作为一个中间值,在某些情况时再赋给sta
for(int i=0;i<n;i++){
cin>>num;
sum+=num;
if(sum>max){
max=sum;
sta=tep;
end=i+1;
}
if(sum<0){//这里是对于全是负数和前面的序列相加小于0的情况的处理
sum=0;
tep=i+2;
}
}
printf("Case %d:\n",time++);
printf("%d %d %d\n",max,sta,end);
if(t) cout<<endl;
}
return 0;
}