思路:
用“在线处理”算法,见最大子列和问题
设置head和rear分别存放最大子列所对应的首项和尾项的下标。
设置head1临时存放正在求和的子列的首项,若正在求和的子列的和大于max,则将head1赋值给head。
初始化rear为-1,可根据rear的值去判断是否全是负数。若数列全为负数,则rear始终为-1,否则rear不为-1。
注意:
1、让你输出的是numbers!是数而不是对应的下标!
2、head、rear、head1都要提前初始化一下,避免未使用而在输出时发生未知的错误
#include<iostream>
using namespace std;
int main()
{
int k;
cin>>k;
int array[k];
int max = -1;
for(int i = 0;i<k;i++){
cin>>array[i];
}
int ThisSum = 0;
int head,rear;
int head1 = 0;
head = 0;
rear = -1;
for(int i = 0;i<k;i++){
ThisSum+=array[i];
if(ThisSum>max){
head = head1;
rear = i;
max = ThisSum;
}
if(ThisSum<0){
ThisSum = 0;
head1 = i+1;
}
}
if(rear!=-1){
cout<<max<<' '<<array[head]<<' '<<array[rear];
}
else{
cout<<0<<' '<<array[0]<<' '<<array[k-1];
}
}