描述:
给出n个整数(亦正亦负)组成的序列a[1],a[2],a[3],…,a[n],求该序列中a[i]+a[i+1]+…+a[j]的子段和的最大值。当最大子段和为负数时,规定此数列的最大子段和为0.
算法和思路:
依据上面的描述,所求的点i最大路径和c[i]应该为:Max{a[i], c[i - 1] + a[i]}
源代码:
#include
<
stdio.h
>
#define MAX 10
int maxSubSum( int P[])
... {
int i;
int maxsum = 0;
int c = 0;
for(i = 0; i < MAX; i++)
...{
if(c > 0)
c += P[i];
else
c = P[i];
if(c > maxsum)
maxsum = c;
}
return maxsum;
}
int main()
... {
int A[MAX];
int i;
int sum;
printf("Please input a array: ");
for(i = 0; i < MAX; i++)
scanf("%d",&A[i]);
sum = maxSubSum(A);
printf(" The Max subsum is: %d",sum);
return 0;
}
#define MAX 10
int maxSubSum( int P[])
... {
int i;
int maxsum = 0;
int c = 0;
for(i = 0; i < MAX; i++)
...{
if(c > 0)
c += P[i];
else
c = P[i];
if(c > maxsum)
maxsum = c;
}
return maxsum;
}
int main()
... {
int A[MAX];
int i;
int sum;
printf("Please input a array: ");
for(i = 0; i < MAX; i++)
scanf("%d",&A[i]);
sum = maxSubSum(A);
printf(" The Max subsum is: %d",sum);
return 0;
}
这个算法的时间复杂度是O(n),相对于分治算法的O(nlogn)效率要高.