最大子序列和 分而治之

分而治之求 一个数列最大连续子数列和。
原理图片来源与网络,如侵权请联系
利用递归的思想,将数列不断地分成两半,分到最小时为一个数。返回一个初值,然后再判断4,-3,4+(-3),哪个大,在返回4,再判断5与-2,返回5,再判断4与,依次类推。

下面是代码

#include<iostream>
using namespace std;
int crossmax(int *a, int left, int right, int mid)
{
	int lefsum = 0;
	int rigsum = 0;
	int leffinsum = a[mid];
	int rigfinsum = 0;
	for (int i = mid; i >= 0; i--)
	{
		lefsum += a[i];
		if (lefsum > leffinsum)
		{
			
			leffinsum = lefsum;
		}
	}
	for (int i = mid + 1; i < right; i++)
	{
		rigsum += a[i];
		if (rigsum > rigfinsum)
		{	
			rigfinsum = rigsum;
		}
	}
	return rigsum + lefsum;
}
int max(int a, int b)
{
	return a > b ? a : b;
}
int findmax(int *a, int left, int right)
{
	if (left == right) { return a[left]; }

	int mid = (left + right) / 2;
	int lefsum = findmax(a, left, mid);//求左边最大子序列,递归思想由小退大;需确立中间值;left->mid;
	int rigsum = findmax(a, mid + 1, right);////求右边最大子序列,递归思想由小退大;需确立中间值;mid+1->right;
	int cross = crossmax(a, left, right, mid);//调用函数将已求出左序列与右序列,从中间开始向两边退,求出跨边界的最大序列和
	return max(max(lefsum, rigsum), cross); //返回最大值
}



int main()
{
	int k;
	int a[100];
	cin >> k;
	for (int i = 0; i < k; i++)
		cin >> a[i];
	cout << findmax(a, 0, k-1);
	system("pause");
}



发布了17 篇原创文章 · 获赞 1 · 访问量 3439

猜你喜欢

转载自blog.csdn.net/weixin_43983570/article/details/90341960