最大子序列和的问题
思想描述:将K个整数组成的序列{N1,N2,…,Ni},“连续子列”被定义为{Ni,Ni+1,…,Nj},其中1<=i<=j<=k;最大子序列和的问题被定义为所有连续子列元素的和的最大值(如果子列和为负值,那么直接舍弃,对后面的子列贡献为负)。
#include <stdio.h>
#define MaxValue 100
int Max(int A,int B,int C)
{
return (A>B?) && (A>C?) A:B>C? B:C;
}
int DivideAadConquer(int A[],int start,int last)
{
int MaxLeftSum=0,MaxRightSum=0;//为左右单个数字
int MaxLeft=0,MaxRight=0;//为左右最大的和,
int LeftSum=0,RightSum=0;
mid = (start+last)/2;
if(start>=last)//数组仅存在一个元素的情况
{
//保证开头就是>0的数值
if(start<=left)
return start[0]>0?start[0]:0;
}
//分解数组为左右两个数组
else
{
if(start<mid && mid+1<last)
{
//划分左侧子数组
MaxLeftSum = DivideArray(A,start,start+mid);
//划分右侧子数组
MaxrightSum = DivideArray(A,start+mid+1,last);
//进行序列求和
//求左侧最大子列和//从中线向左
for(int i = mid;i>=left;i--)
{
LeftSum +=List[i];
if(LeftSum>MaxRight)
{MaxRight = LeftSum;}
}
//求右侧最大子序列和//从中线向右
for(int i = mid+1;i<=right;i++)
{
RightSum += List[i];
if(MaxRight<RightSum)
{
MaxRight = RightSum;
}
}
return Max(MaxLeftSum,MaxRightSum,MaxLeft+MaxRight);
}
}
}
int main()
{
int A[MaxValue];
int n;
int B[MaxValue];
scanf("%d",&n);
//输入数据
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
//开始将数组分成子数组
DivideAadConquer(A,0,n-1);
return 0;
}