自己动手“敲”微软100题系列三

题目如下:


参考文档的思路,这是一种传统的贪心算法(又称贪婪算法)问题。它是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。(见百度百科,以后用到再深入)

按照这种思路,我们在从左往右遍历的时候,每次保存的是最大的和,即有新的和大于存储的最大和,则更新,否则需要判断当和是否为负的情况,如果为负,那么对不起,从头开始。(当有负能量是,把它丢掉,从头开始)

   下面上代码:

//参考: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();
}

下面是运行结果:


欢迎各位大牛指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值