给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的和,使其和最大,(如果

要详细的代码和一定的注释... 要详细的代码和一定的注释 展开
 我来答
xoalyg
2011-10-27 · TA获得超过4178个赞
知道大有可为答主
回答量:2356
采纳率:100%
帮助的人:2356万
展开全部

#include <stdio.h>

int MaxSum(int *a,int n) {

int i,sum = 0,max = 0;

bool flag1 = false,flag2 = false;

for(i = 0;i < n;i++) {

if(a[i] > 0) flag1 = 1;

if(a[i] < 0) flag2 = 1;

}

if(flag1 && flag2) { // 序列中有正数,也有负数

for(i = 0;i < n;i++) {

if(a[i] < 0) {

if(max < sum) {

max = sum;

sum = 0;

}

}

else sum += a[i];

}

if(max < sum) max = sum;

}

else if(flag1 && !flag2) { // 全部为正

for(i = 0;i < n;i++) max += a[i];

}

else if(!flag1 && flag2) {

max = a[0];

for(i = 1;i < n;i++) {

if(a[i] > max) max = a[i];

}

}

else max = 0; // 全部为零

return max;

}

int main() {

int a[] = {31,-98,45,77,89,12,-92,88,80,120};

for(int i = 0;i < 10;i++) printf("%d ",a[i]);

printf("\nMAX = %d\n\n",MaxSum(a,10));

return 0;

}

百度网友3fceaba35
推荐于2018-05-17
知道答主
回答量:8
采纳率:100%
帮助的人:4.8万
展开全部
上面的解答明显不是满足连续和最大的解:如:int a[] = {31,-98,45,77,89,12,-92,88,80,120};是你自己给的例子,那么按照你的算法得出的Max=288;那么45,77,89,12,-92,88,80,120的和是多少呢?显然大于288.(注意这几个数的和45,77,89,12,-92大于零)。下面我给出本人的代码:
#include<stdio.h>
int main(){
int max,sum,n,x;
while(scanf("%d",&n)!=EOF){
sum=0;
max=0;
while(n--){
scanf("%d",&x);
sum+=x;
if(sum>0){//sum大于0
if(sum>max){//sum大于max则sum赋值给max,否则继续加下一个数
max=sum;
}
}
else{//sum<0,置sum为0
sum=0;
}
}
printf("%d\n",max);
}
return 0;
}
如3 2 -7 6 5 -10 3,求其中连续数字最大的和的过程如下:
设两个变量,sum和max。
sum 从前往后做相加运算,如果sum为正,则max和sum比较,取较大的放入max;如果sum小于max,则继续向后加;如果sum小于0,则sum清除为0。对于上述数组,
1.
sum = 3
max = 3

sum = 5
max = 5

sum = -2
max =5 sum = 0

sum = 6
max = 6

sum = 11
max = 11

sum = 1
max = 11

sum = 4
max = 11

则最大数是11
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式