最大子段和

来源:互联网 发布:大型无人机价格 知乎 编辑:程序博客网 时间:2024/06/05 04:56
#include "stdio.h"#include "stdlib.h"#include "math.h"#include "string.h"#define N 100int max(int a, int b){    return a>b?a:b;}int MaxSum(int a[N], 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[N];    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;}
0 0
原创粉丝点击