1.通过分治法求解最大子段和问题
递归来求解:
#include<stdio.h>
#define n0 10
int maxsum(int a[n0],int left,int right){
int j,sum;
int center,leftsum,rightsum;
int s1,s2,lefts,rights;
if(left==right) { sum=a[left];return sum;} //出口
center=(left+right)/2;
leftsum=maxsum(a,left,center);
rightsum=maxsum(a,center+1,right);
s1=0; lefts=0;
for(j=center;j>=left;j--){
lefts=lefts+a[j];
if(lefts>s1) s1=lefts;
}
s2=0;rights=0;
for(j=center+1;j<=right;j++){
rights=rights+a[j];
if(lefts>s2) s2=rights;
}
sum=s1+s2;
if(sum<leftsum) sum=leftsum;
if(sum<rightsum) sum=rightsum;
return sum;
}
void main(){
int a[n0]={0,5,5,5,5,5,0,-2,10,0};
int left=0,right=n0-1,sum;
int j;
sum=maxsum(a,left,right);
printf("序列(");
for(j=0;j<n0;j++)
printf("%5d",a[j]);
printf(")\n");
printf("的最大子段和为:%5d\n",sum);
}
2.第二种就是直接枚举,暴利求解最大子问题,看着蛮简单的
#include<stdio.h>
#define n0 10
void main(){
int a[n0]={5,5,5,5,5,0,0,0,-20,0};
int sum,lsum;
int i,j;
sum=0;
for(i=0;i<n0;i++)
{
lsum=0;
for(j=i;j<n0;j++){
lsum=lsum+a[j];
if(lsum>sum) sum=lsum;
}
}
printf("序列(");
for(j=0;j<n0;j++)
printf("%5d",a[j]);
printf(")\n");
printf("的最大子段和为:%5d\n",sum);
}