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