最大子序列和 分而治之

分而治之求 一个数列最大连续子数列和。
原理图片来源与网络,如侵权请联系
利用递归的思想,将数列不断地分成两半,分到最小时为一个数。返回一个初值,然后再判断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");
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值