给出一个数组a[]与数组长度N,求该数组中最大子列和。(子列由数组中连续的元素组成)
int MaxSubseqSum1(int a[], int N) //O(n^3) { int MaxSum = 0; for (int i = 0; i < N; i++) //i为子列左边界 { for (int j = i; j < N; j++) //j为子列右边界 { int TempSum = 0; for (int k = i; k <= j; k++) //遍历子列内的元素 { TempSum += a[k]; } if ( TempSum > MaxSum ) { MaxSum = TempSum; } } } return MaxSum; } int MaxSubseqSum2(int a[], int N) //O(n^2) { int MaxSum = 0; for (int i = 0; i < N; i++) { int TempSum = 0; for (int j = i; j < N; j++) { TempSum += a[j]; if (TempSum > MaxSum) { MaxSum = TempSum; } } } return MaxSum; } int MaxSubseqSum3(int a[], int N) //O(N) { int MaxSum, TempSum; MaxSum = TempSum = 0; for (int i = 0; i < N; i++) { TempSum += a[i]; if ( TempSum > MaxSum ) { MaxSum = TempSum; } else if ( TempSum < 0 ) //关键:如果当前子列和为负,则不可能使后面的部分和增大,因此可舍弃 { TempSum = 0; } } return MaxSum; }