最大子序列和问题

来源:互联网 发布:算法精解 java 编辑:程序博客网 时间:2024/06/08 15:10

描述:给定整数a1,a2,。。。an。(可能为负数),求    的最大值。(如所有整数均为负数,则最大子序列和为0)

算法一,

int sum(const int a[],int N){ int sum,max,i,j; for(i=0;i<N;i++){     sum=0;     for(j=i;j<N;j++){          sum +=a[j];          if(sum>max) max = sum;     } } return max ;} 

算法二:分治

#include <stdio.h>//求三个数的最大值int max(int a,int b,int c){    if(a<b)        a = b;    if(a<c)        a = c;    return a;}static int sum(const int a[],int left,int right){    int maxleftsum,maxrightsum;    int maxleftbordersum,maxrightbordersum;    int leftbordersum,rightbordersum;    int center,i;    if(left==right)  //判断是否就一个数        if(a[left]>0)            return a[left];        else            return 0;    //(如所有整数均为负数,则最大子序列和为0)    center = (left+right)/2;    maxleftsum = sum( a,left,center);      maxrightsum = sum(a,center+1,right);      maxleftbordersum =0;           //计算前半部分    leftbordersum =0;    for(i=center;i>=left;i--){                     leftbordersum += a[i];        if(leftbordersum>maxleftbordersum)            maxleftbordersum = leftbordersum;    }    maxrightbordersum = 0;         //后半部分    rightbordersum =0;    for(i=center+1;i<=right;i++){        rightbordersum += a[i];        if(rightbordersum>maxrightbordersum)            maxrightbordersum = rightbordersum;    }    return max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);}int re(const int a[],int N){    return sum(a,0,N-1);}int main(){    int a[]={4,-3,5,-2,-1,2,6,-2};    int result;    result = re(a,8);    printf("%d\n",result);   return 0 ;}


结果输出为11。

0 0
原创粉丝点击