题目
01-复杂度2 Maximum Subsequence Sum (25 分)
题目分析
这个题目跟01-复杂度1 最大子列和问题有点类似,两题的区别在于后者不仅要输出最大子序列之和,还要输出这个子序列首尾的数字,注意不是下标,我就在这里WA了。。。而且当数据全为负数时,输出0,第一个和最后一个数据。
有几点想特别提醒一下:
1.注意最大子序列之和初始化为-1,而不是0,因为当序列为负数和0的时候,遇到0可以更新子序列起始和终止下标;
2.当序列中没有正数,要么就是全为负数,要么就是负数和0。如果全是负数,就按照题目要求输出,这个在输出的地方处理;如果是负数和0,更新最大子序列之和,同时还要更新起止下标;
3.一定要注意输出的后面两个是起止的数据,不是下标。
代码实现
#include<iostream>
using namespace std;
const int MAXSIZE=1e4+5;
int main()
{
int k,sum=0,maxsum=-1;
int a[MAXSIZE];
int start,last,t=0;
int i;
cin>>k;//数据个数
for(i=0; i<k; ++i)
cin>>a[i];
for(i=0; i<k; ++i)
{
sum+=a[i];
if(sum>maxsum)
{
maxsum=sum;
last=i;
start=t;
}
else if(sum<0&&i<k-1)
{
sum=0;
t=i+1;
}
if(maxsum==0&&a[i]==0)//存在0且没有正数
{
start=i;
last=i;
}
}
if(maxsum>=0)
cout<<maxsum<<" "<<a[start]<<" "<<a[last]<<endl;
else
cout<<0<<" "<<a[0]<<" "<<a[k-1]<<endl;
return 0;
}