給定k個整數的序列{N1,N2,...,Nk },其任意連續子序列可表示爲{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。最大連續子序列是全部連續子序中元素和最大的一個,例如給定序列{ -2, 11, -4, 13, -5, -2 },其最大連續子序列爲{11,-4,13},最大連續子序列和即爲20。算法
算法四:動態規劃法數組
時間複雜度:O(N) 方法
終於到了動態規劃的部分了,這麼一步一步走來,感覺到了算法的無窮魅力。那麼如何用動態規劃來處理這個問題? 數據
首先,咱們重溫將一個問題用動態規劃方法處理的準則: 動態規劃
「最優子結構」、「子問題重疊」、「邊界」和「子問題獨立」。 時間
在本問題中,咱們能夠將子序列與其子子序列進行問題分割。 co
最後獲得的狀態轉移方程爲: 分割
MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]}; return
在這裏,咱們沒必要設置數組MaxSum[]。 const
代碼實現:
int MaxSubSequence(const int A[], int N) { int ThisSum,MaxSum,j; ThisSum = MaxSum =0; for(j = 0;j < N;j++) { ThisSum += A[j]; if(ThisSum > MaxSum) MaxSum = ThisSum; else if(ThisSum < 0) ThisSum = 0; } return MaxSum; }
在本代碼實現中,ThisSum持續更新,同時整個過程,只對數據進行了一次掃描,一旦A[i]被讀入處理,它就再也不須要被記憶。(聯機算法)