最大子段和問題分析

2021-05-22 00:30:44 字數 958 閱讀 3377

問題:

給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整均為負數時定義子段和為0,依此定義,所求的最優值為:

max,1<=i<=j<=n

例如,當(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)時,最大子段和為20。

此問題最常見,也是最容易想到的辦法:

對這種三層迴圈的解法進行初步的優化,因為數列和具有如下性質:

s[i] = s[i-1]+a[i];

再對上面的演算法進行如下優化:

1.空間優化,由於沒有必要把所有的子段和儲存下來,因為直接用乙個變數sum儲存最大子段和便可

2.時間優化,由於s[i] = s[i-1]+a[i]因此不需要把所有的s求出來

**如下:

以上已經是屬於o(n^2)中最優的演算法了,但對於1w+級的資料,處理速度仍然太慢。

於是思考以分治法:

1.把整個段分成兩部分,m = (left+right)/2

2.最大子段和要麼屬於左邊部分,要麼屬於右邊部分,要麼屬於包含a[m],a[m+1]的某個中間部分

3.對於屬於左右兩部分的,可以遞迴求出,重點是處理中間部分。

4.由於中間部分必然包含a[m],a[m+1]。因此把a[m]~a[0]倒過來求和,最大者即為左邊必然包括a[m]的最大子段和lmax,同理可得右邊rmax,所以lmax+rmax必然是包含a[m],a[m+1]的最大子段和。

5.以上三者,返回其較大值

**如下:

再思考這個問題,實際上是典型的子結構問題,可以使用動態規劃來解。

定義b[i]為 子段結束位置為 i 時的最大子段和,那麼當b[i-1]>0時,b[i] = b[i-1]+a[i]否則b[i] = a[i]

最後,陣列b[i]中最大值必然為最大子段和 :

最大子段和問題

給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0 分治法 分析 首先將陣列分為兩部分,最大子段和 可以在陣列的左半部分也可以在右半部分,也可以橫跨分割點,因此我們只需要用分治思想求出左邊最大...

最大子段和問題

給定n 個整數 有可能是負數 組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有...

最大子段和問題

問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如 a i a i 1 a j 當所給的整數均為負數時定義子段和為0.如果序列中全部是負數則 最大子段和為0,依次所定義 所求的最優值max,1 i問題解析 動態規劃演算法 dp i 包含元素i的子段和 dp 0 ...