核心思想:如果整数序列{a1, a2,…,an}的最大子列和是{ai, ai+1,…,aj},那必定有∑ai~al≥0对任意i≤l小于等于j成立。因此,一旦发现当前子列和为负,则可以重新开始考察一个新的子列。
#include <stdio.h>
#include <stdlib.h>
#define MAXN 10
int MaxSubSeqSum(int *list, int N){
int i;
int theSum, maxSum;
theSum = maxSum = 0;
for(i = 0; i < N; i++){
theSum += list[i];//向右累加
if(theSum>maxSum){
maxSum = theSum;//发现更大的和则更新当前结果
}
if(theSum<0){//如果当前子列和为负,则不可能使后面的部分增大
theSum = 0;//抛弃之
}
}
return maxSum;
}
//测试函数
int main()
{
int List[MAXN];
int i, maxSum;
for(i=0; i < MAXN; i++){
scanf("%d", &List[i]);
}
maxSum = MaxSubSeqSum(&List, MAXN);
printf("max sum of subSeq is %d", maxSum);
return 0;
}