题目如下:
参考文档的思路,这是一种传统的贪心算法(又称贪婪算法)问题。它是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。(见百度百科,以后用到再深入)
按照这种思路,我们在从左往右遍历的时候,每次保存的是最大的和,即有新的和大于存储的最大和,则更新,否则需要判断当和是否为负的情况,如果为负,那么对不起,从头开始。(当有负能量是,把它丢掉,从头开始)
下面上代码:
//参考:http://www.cnblogs.com/caidaxia/archive/2011/10/14/2212369.html
//文档中的说法说是一个传统的贪心算法问题。
#include <iostream>
#include <iomanip>
#include <time.h> //得到从标准计时点(一般是1970年1月1日午夜)到当前时间的秒数。
using namespace std;
int maxSonArray(int* a,int nSize)
{
int sum=0;
int max=a[0];//表示最大
for(int i=0;i<nSize;i++)
{
sum=sum+a[i];
if (sum>max)
{
max=sum;
}else if (sum <0)
{
sum=0;
}
}
return max;
}
void main()
{
unsigned int timeCur=(unsigned)time(NULL);
//cout <<"time is : "<< timeCur<< endl;
srand(timeCur); //用来产生随时间不同的随机数
const int nSize=10;
int inputArray[nSize];
cout <<"随机产生了" << nSize <<"个整数数组成的数组"<< endl;
for (int i=0;i<nSize;i++)
{
inputArray[i]=rand()%101-50; //产生的随机数在-50到50之间
cout << setfill(' ') << setw(5) <<inputArray[i];
}
cout << endl << "最大的子数组和为: " << maxSonArray(inputArray,nSize) << endl;
//让控制台程序停留下
getchar();
}
下面是运行结果:
欢迎各位大牛指正。