最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积

Posted mingc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积相关的知识,希望对你有一定的参考价值。

来自:《数据结构与算法分析——C语言描述》练习2.12

一. 最大子序列和

1.穷举法,O(N3

 1 int maxSequenceSum1(const int A[], int N)
 2 {
 3     int i, j, k, maxSum, thisSum;
 4 
 5     maxSum = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         for (j = i; j < N; j++)
 9         {
10             thisSum = 0;
11             for (k = i; k <= j; k++)
12                 thisSum += A[k];
13 
14             if (thisSum > maxSum)
15                 maxSum = thisSum;
16         }
17     }
18   return maxSum;
19 }

2.撤一个for,O(N2

 1 int maxSequenceSum2(const int A[], int N)
 2 {
 3     int i, j, maxSum, thisSum;
 4 
 5     maxSum = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         thisSum = 0;
 9         for (j = i; j < N; j++)
10         {
11             thisSum += A[j];
12 
13             if (thisSum > maxSum)
14                 maxSum = thisSum;
15         }
16     }
17     return maxSum;
18 }

 3.分治算法,O(NlogN)

 1 int maxSubSum(const int A[], int left, int right)
 2 {
 3     int maxLeftSum, maxRightSum;
 4     int maxLeftBorderSum, maxRightBorderSum;
 5     int leftBorderSum, rightBorderSum;
 6     int center, i;
 7 
 8     if (left == right)    /*Base case*/
 9     {
10         if (A[left] > 0)
11             return A[left];
12         else
13             return 0;
14     }
15 
16     center = (left + right) / 2;
17     maxLeftSum = maxSubSum(A, left, center);
18     maxRightSum = maxSubSum(A, center + 1, right);
19 
20     maxLeftBorderSum = 0;    leftBorderSum = 0;
21     for (i = center; i >= left; i--)
22     {
23         leftBorderSum += A[i];
24         if (leftBorderSum > maxLeftBorderSum)
25             maxLeftBorderSum = leftBorderSum;
26     }
27 
28     maxRightBorderSum = 0;    rightBorderSum = 0;
29     for (i = center + 1; i <= right; i++)
30     {
31         rightBorderSum += A[i];
32         if (rightBorderSum > maxRightBorderSum)
33             maxRightBorderSum = rightBorderSum;
34     }
35     return max(maxLeftSum, maxRightSum,
36         maxLeftBorderSum + maxRightBorderSum);
37 }
38 
39 int maxSequenceSum3(const int A[], int N)
40 {
41     return maxSubSum(A, 0, N - 1);
42 }

 4.联机算法,O(N)

 1 int maxSequenceSum4(const int A[], int N)
 2 {
 3     int i, maxSum, thisSum;
 4 
 5     maxSum = 0; thisSum = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         thisSum += A[i];
 9 
10         if (thisSum> maxSum)
11             maxSum = thisSum;
12         else if (thisSum < 0)
13             thisSum = 0;
14     }
15     return maxSum;
16 }

 我们仍然采用更优的联机算法来求解最小子序列和、最小正子序列和、最大子序列乘积。

二.最小子序列和

 1 int minSequenceSum(const int A[],int N)
 2 {
 3     int minSum, thisSum, i;
 4 
 5     minSum = 0; thisSum = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         thisSum += A[i];;
 9 
10         if (thisSum < minSum)
11             minSum = thisSum;
12         else if (thisSum>0)
13             thisSum = 0;
14     }
15     return minSum;
16 }

三.最小正子序列和

 1 int minPositiveSubSum(const int A[], int N)
 2 {
 3     int minSum, thisSum, i;
 4 
 5     minSum = 0x7FFFFFFF; thisSum = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         thisSum += A[i];
 9 
10         if (thisSum < minSum && thisSum > 0)
11             minSum = thisSum;
12         else if (thisSum < 0)
13             thisSum = 0;
14     }
15     return minSum;
16 }

四.最大子序列乘积

 1 int maxPositiveSubMul(const int A[], int N)
 2 {
 3     int maxMul, thisMul, i;
 4 
 5     maxMul = 1; thisMul = 1;
 6     for (i = 0; i < N; i++)
 7     {
 8         thisMul *= A[i];
 9 
10         if (thisMul > maxMul)
11             maxMul = thisMul;
12     }
13 
14     return maxMul;
15 }

 

以上是关于最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积的主要内容,如果未能解决你的问题,请参考以下文章

最小正子段和 贪心

最大子段和之环形问题

最小正子段和

最小正子段和(前缀和+思维)

zznu-2060 Minsum Plus(最小正子段和)

最大异或子序列问题