#include <iostream>
#include <ctime>
using namespace std;
/*************************
** 求数组list从begin到end中和最大的子序列
** 参数:
list : 要求的数组
begin : 数组的起始位置
end : 数组的结束位置
sbegin : 最大子序列的起始位置(作为返回值)
send : 最大子序列的结束位置(作为返回值)
** 返回值:
最大子序列的和
*/
long BigestSequence(int *list , size_t begin , size_t end , size_t &sbegin , size_t &send)
{
long max = 0;
long sum = 0;
sbegin = send = 0;
size_t pos = 0;
for(size_t i = begin ; i <= end ; ++i)
{
sum += list[i];
if(max <= sum)
{
max = sum;
sbegin = pos;
send = i;
}
if(sum < 0)
{
sum = 0;
pos = i+1;
}
}
return max;
}
int main()
{
int *list;
int len;
cin>>len; //输入数组长度
list = new int[len];
srand(time(0));
//随机生成数组值,值在[-len^2,len^2之间]
for(size_t i = 0 ; i != len ; ++i)
{
list[i] = (rand()%2?1:-1) * (rand()%(len*len));
cout<<list[i]<<" ";
}
cout<<endl;
size_t start , end; //记录得到的最大子序列的起始和结束位置
cout<<BigestSequence(list,0,len-1,start,end)<<endl<<start<<" "<<end<<endl;;
system("pause");
return 0;
}