最大子段和系列(二維子段和、環形數組子段和、最大m段和) 思路

一、最大子段和

        設F(i) 爲 數組中以a[i]結尾的最大子段和, 那麼只需要遍歷 0~n 找到max{F(0)  F(1) ...... F(n-1)}

        F(i) =   a[i]      F(i-1) < 0

                    F(i-1) + a[i]


二 、最大環形數組子段和

       思路一:把環形最大子段和可以看做兩部分。 第一部分——正常最大子段和,第二部分——跨越a[0] 和 a[n-1]的最大子段和。 那麼第一部分可以用O(n) 求出,第二部分我們

      從a[0] 開始計算 0~n-2 的最大和,記錄結束位置position1。 再從a[n-1] 開始計算 n-1~1的最大和,記錄結束位置 position2。

       position2  > position1    則第二部分最大和 a[0] + ... a[position1] + a[position2] + ...a[n-1]

       position2 <= position1   則第二部分最大和 a[0] + ....... a[n-1]

      思路二: 數組總和  -  最小子段和


三、最大M段和

      問題 :從數組中確定M個不相交的子序列,使這M個子序列的和最大!

      設F(i, j) 爲 在前i個元素中選j個子段的最大和,且包含元素a[j]. 那麼對於a[j] ,  1) a[j] 自己組成第 j 子段 ; 2) a[j] 包含於第 j 子段中;

       對於情況1)  F(i , j)  = max{所有 j-1 子段} + a[i] = F(k, j - 1) + a[j]   k 屬於[j-1,  i-1] 

       對於情況2)  F(i , j)  =  F(i-1, j) + a[i]

       顯然 F(i, j) 取值爲情況1 與 情況2的最大者

四 、二維子段和

            思路把二維的壓縮爲一維

五、絕對值系列

       最大絕對值子段和: 要麼正的最大,要麼負的最小。 所以問題解等於max{abs(最大子段和), abs(最小子段和)}


       最小絕對值字段和:

                  1) 構造數組 b[0] = a[0];

                                        b[1] = a[0] + a[1];

                                        ...........

                                        b[n-1] = a[0] + ......+a[n-1];

                  2) 對b排序(保留index 信息)

                  3) 求排序後數組相鄰位置差最小

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章