描述:給定整數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。