题目详情:https://www.patest.cn/contests/pat-a-practise/1007
最大字串和问题,但是我却思考了好久,原因是我没有看清题意[衰]。例子中给出的输出也太具有迷惑性了,当然主要还是看清题意。特此谨记!
#include <iostream>
using namespace std;
#define K 10001
int main()
{
int k,seq[K],negative=0;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&seq[i]);
if(seq[i]<0)
negative++;
}
if(negative==k)//全是负数的情况
{//输出0,第一个元素和最后一个元素
cout<<0<<" "<<seq[1]<<" "<<seq[k]<<endl;
return 0;
}
int location=seq[1],largeSum=seq[1];
//ls和le存储局部location的最优的位置,ts和te存储全局最优的位置
int ls=1,le=1,ts=1,te=1;
for(int i=2;i<=k;i++)
{
//location是包含当前元素的局部最优
if( location+seq[i]>seq[i] )//location是一个正数,前边某个序列的值是正数
{
location=location+seq[i];//改变局部最优的值
le=i;//只需要改变结束的位置
}
else//location+seq[i]<seq[i],当前元素的值较大
{
location=seq[i];
ls=le=i;
}
//该条语句主要用来更新全局最优的解
if(location>largeSum)
{
largeSum=location;
ts=ls;te=le;
}
}
cout<<largeSum<<" "<<seq[ts]<<" "<<seq[te]<<endl;
return 0;
}