#include <stdio.h>
long max3(long a, long b, long c) //求出3个long中的最大值
{
if (a > b) a = b; //用a保存a、b中的最大值
if (a > c) return a; //比较返回a、c的最大值
else return c; //a大返回a,c大返回c
}
long maxSubSum(int a[], int left, int right) //求a[left...right]序列中的最大连续子序列和
{
int i, j;
long maxLeftSum, maxRightSum;
long maxLeftBorderSum, leftBorderSum;
long maxRightBorderSum, rightBorderSum;
if (left == right) //left==right说明子序列只有一个元素
{
if (a[left] > 0) //大于时返回自身,小于0时返回0
return a[left];
else
return 0;
}
int mid = (left + right) / 2; //中间位置
maxLeftSum = maxSubSum(a, left, mid); //求左边的最大连续子序列之和
maxRightSum = maxSubSum(a, mid + 1, right); //求右边最大连续子序列之和
maxLeftBorderSum = 0, leftBorderSum = 0;
for (i = mid; i >= left; i--) //求出以左边加上a[mid]元素构成的序列的最大和
{
leftBorderSum += a[i];
if (leftBorderSum > maxLeftBorderSum)
maxLeftBorderSum = leftBorderSum;
}
maxRightBorderSum = 0, rightBorderSum = 0;
for (j = mid + 1; j <= right; j++) //求出a[mid]右边元素构成的序列的最大元和
{
rightBorderSum += a[j];
if (rightBorderSum > maxRightBorderSum)
maxRightBorderSum = rightBorderSum;
}
return max3(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
//返回左部分、右部分以及以mid为中心的最大连续子序列和三者中的最大值
}
int main()
{
int a[] = { -2,11,-4,13,-5,-2 }, n = 6;
int b[] = { -6,2,4,-7,5,3,2,-1,6,-9,10,-2 }, m = 12;
printf("a序列的最大连续子序列的和:%ld\n", maxSubSum(a, 0, n - 1));
printf("b序列的最大连续子序列的和:%ld\n", maxSubSum(b, 0, m - 1));
}
【算法】求解最大连续子序列和的问题
最新推荐文章于 2021-12-21 12:13:27 发布