一.前言
前言如上,懒得说了。直接赋正文。
二.内容
#include<stdio.h>
int max3(int a, int b, int c) // 求三个数的最大值
{
int max = a;
if (b > max)
max = b;
if (c > max)
max = c;
return max;
}
int MaxSubsequenceSum(int array[], int left, int right)
{
//int max3(int a, int b, int c) ;
if (left==right) // 设置基准,即递归终止条件
return array[left];
int middle = (left + right) / 2;
int leftMaxSubsequenceSum = MaxSubsequenceSum(array, left, middle); // 求左半部分最大子序列和
int rightMaxSubsquenceSum = MaxSubsequenceSum(array, middle + 1, right); // 求右半部分最大子序列和
// 处理左右边界问题:最大子序列跨越中间,包含左半部分最右一个数,同时包含右半部分最左一个数
int maxLeftBorderSum = 0;
int maxRightBorderSum = 0;
int tempSum = 0; // 临时求和变量
int i;//循环变量
for ( i = middle;i >= left;i--)
{
tempSum += array[i];
if (tempSum > maxLeftBorderSum)
maxLeftBorderSum = tempSum; // 左边包含边界最大序列和
}
tempSum = 0;
for ( i = middle+1;i <= right;i++)
{
tempSum += array[i];
if (tempSum >maxRightBorderSum)
maxRightBorderSum = tempSum; // 右边包含边界最大序列和
}
int maxBorderSum =maxLeftBorderSum+maxRightBorderSum ; // 最大边界子序列和等于两部分边界之和
return max3(leftMaxSubsequenceSum,rightMaxSubsquenceSum, maxBorderSum); // 返回三个部分的最大子序列和
}
int main()
{
int a[100];
int i,n;
scanf("%d",&n);
for(i=0;i<n-1;i++)scanf("%d",&a[i]);
int maxSubSum = MaxSubsequenceSum(a, 0, n-1);
printf("%d",maxSubSum);
printf("\n");
return 0;
}