原文地址:http://blog.youkuaiyun.com/zhaobryant/article/details/38537457?utm_source=tuicool&utm_medium=referral
最大连续子序列和问题
给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20。
注:为方便起见,如果所有整数均为负数,则最大子序列和为0。
解决这样一个问题是一个很有趣的过程,我们可以尝试着从复杂度比较高的算法一步一步地推出复杂度较低的算法。
算法一:
时间复杂度:O(N^3)
其代码:
- int MaxSubSequence(const int A[], int N){
- int ThisSum,MaxSum,i,j,k;
- MaxSum = 0;
- for(i=0;i<N;i++)
- {
- for(j=i;j<N;j++)
- {
- ThisSum = 0;
- for(k=i;k<=j;k++)
- {
- ThisSum += A[k];
- }
- if(ThisSum > MaxSum)
- MaxSum = ThisSum;
- }
- }
- return MaxSum;
- }
对于此种算法,其主要方法是穷举法,即求出该序列所有子序列的序列和,然后取最大值即可。
算法二:
时间复杂度:O(N^2)
其代码:
- int MaxSubSequence(const int A[], int N){
- int