二分法求最大字段和
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章
例15 求数列的最大子段和
给定n个元素的整数列(可能为负整数)a1,a2,…..,an。求形如:
ai,ai+1,……aj i,j=1,…..,n,i<=j
的子段,使其和为最大。当所有整数均为负整数时定义其最大子段和为0. 程序:
#include
int maxsum2(int a[],int left,int right)
{
int center,i,left_sum,right_sum,s1,s2,lefts,rights;
if(left==right)
if(a[left]>0)
return a[left];
else
return 0;
else
{
center=(left+right)/2;
left_sum=maxsum2(a,left,center);
right_sum=maxsum2(a,center+1,right);
s1=0;
lefts=0;
for(i=center;i>=left;i--)
{
lefts=lefts+a[i];
if(lefts>s1)
s1=lefts;
}
s2=0;
rights=0;
for(i=center+1;i<=right;i++)
{
rights=rights+a[i];
if(rights>s2)
s2=rights;
}
if((s1+s2 return left_sum; if(s1+s2 return right_sum; return(s1+s2); } } int maxsum1(int a[],int n) { return(maxsum2(a,1,n)); } void main() { int a[100],n; printf("enter a number:"); scanf("%d",&n); printf("enter the number of a[]:"); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("%d",maxsum1(a,n)); printf("\n"); } 运行结果: