代码改变世界

Programe_Of_Beauty:2.14 求数组的子数组之和的最大值

2011-06-12 10:09  x_feng  阅读(163)  评论(0编辑  收藏  举报

问题:一个有N个整数元素的一维数组,那么求子数组和的最大值。

分析:首先我们明确问题,子数组是联系的,不用返回元素的位置,元素是整数,可能为正,负或0。我们来看看最经典的解法:a[0],a[1]…a[N-1],用分治的思想,a[0]和a[1]…a[N-1],是什么关系呢?a[1]…a[N-1],包含两部分,1,以a[1]为开头的最大值,2,a[1]…a[N-1],有一个最大值,那么我们只要比较{a[0],a[0]+以a[1]开头的最大值,a[1]…a[N-1]之间的最大值}就可以得出结果,那么a[1]与a[2]…a[N-1]呢?也一样……a[N-2]与a[N-1]呢?代码如下:

 
void FindBigSubArray_FenZhi(int* arr, int size)
{
	int nStart = arr[size - 1];//以arr[size - 1]开头的最大值
	int nAll   = arr[size - 1];//arr[size - 1]到arr[N-1]之间的最大值
	for (int i = size - 2; i >= 0; i--)
	{
		nStart = max1(arr[i], arr[i] + nStart);//比较arr[i]与arr[i]为开头的最大值,nStart确保永远是以arr[i]为开头的最大值跟arr[i]的比较
		nAll   = max1(nStart, nAll);//得到arr[i]之后的一段数组的最大值
	}
	cout<<"max="<<nAll<<endl;
}