鸣谢:感谢@July,您的博客给予我很大的帮助,增强了我学习的动力。希望分享的力量永传!!!
问题来源:http://blog.csdn.net/v_JULY_v/article/details/6444021
问题来源作者:@July
本文作者:@baoquanz
本文仅给予一种实现,增加输出最大序列。
#include <iostream>
using namespace std;
//left和right记录最大序列的开始和结束位置
int max_func(int* a, int len, int& left, int& right)
{
int* b = new int[len];
right = 0;
int max = a[0];
b[0] = a[0];
for (int i=1; i<len; ++i)
{
if (b[i-1] <= 0)
{
b[i] = a[i];
}
else
{
b[i] = b[i-1] + a[i];
}
if (b[i] > max)
{
max = b[i];
right = i;
}
}
int tmp = right;
left = tmp;
for (; tmp>=0; --tmp) //寻找left位置
{
if (b[tmp]<0)
{
break;
}
left = tmp;
}
delete[] b;
return max;
}
int main()
{
int N;
cin>>N;
int* a = new int[N];
for (int i=0; i<N; ++i)
{
cin>>a[i];
}
int left, right;
cout<<max_func(a, N, left, right)<<endl;
for (; left<=right; ++left)
{
cout<<a[left]<<" ";
}
cout<<endl;
delete[] a;
return 0;
}