您的位置:首页 > 其它

最大子段和

2015-10-11 19:53 381 查看
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#define N 100

int max(int a, int b)
{
return a>b?a:b;
}

int MaxSum(int a
, int left, int right)
{  //返回数组a[left:right]最大区间和
if(left == right)
return a[left]>0?a[left]:0;
int mid = (left+right)/2;  //中点
int sum1 = MaxSum(a, left, mid); //递归求左段最大和
int sum2 = MaxSum(a, mid+1, right);  //递归求有段最大和
/*求左子段中的最优子段和值s1,由中点开始,自右向左搜索   */
int s1 = 0;
int lefts = 0;
int i;
for(i=mid; i>=left; i--)
{
s1 += a[i];
if(s1 > lefts)
lefts = s1;
}
/*求右子段中的最优子段和值s2,由中点开始,自左向右搜索   */
int s2 = 0;
int rights = 0;
for(i=mid+1; i<=right; i++)
{
s2 += a[i];
if(s2 > rights)
rights = s2;
}
int sum3 = rights + lefts;
int sum12 = max(sum1, sum2);
return max(sum3, sum12);
}

int main()
{
int a
;
printf("输入元素个数:");
int n;
scanf("%d", &n);
int i;
for(i=0; i<n; i++)
scanf("%d", &a[i]);
int sum = MaxSum(a, 0, n-1);
printf("%d\n", sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: