DP最大M子段和

2021-05-22 05:23:39 字數 461 閱讀 8150

給定n個數求這n個數劃分成互不相交的m段的最大m子段和。

經典的動態規劃優化的問題。設f(i, j)表示前i個數劃分成j段,且包括第i個數的最大m子段和,那麼有dp方程:

f(i, j) = max (k = j - 1 ... i - 1) }

也就是說第i個數要麼自己劃到第j段,要麼和前乙個數一起劃到第j段裡面,轉移是o(n)的,總複雜度o(n * n * m)。

可以引入乙個輔助陣列來優化轉移。設g(i, j)表示前i個數劃分成j段的最大子段和(注意第i個數未必在j段裡面),那麼遞推關係如下:

g(i, j) = max,分是否加入第i個數來轉移

這樣f的遞推關係就變成:

f(i, j) = max + v[i],轉移變成了o(1)

這樣最後的結果就是g[n][m],通過引入輔助陣列巧妙的優化了轉移。實現的時候可以用一維陣列,速度很快。

附hdu 1024題目**:

1052 最大M子段和 (dp)

n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5 6 2,分為2段,11 4 13一段,6一段,和為26。input 第1行 2個數n和m,中間用空格分隔。...

1052 最大M子段和 DP

1052 最大m子段和 基準時間限制 2 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5...

最大子段和與最大m子段和 基礎dp

今天學習了兩個基礎dp,分享一下。求一段序列中的一段子串行,使得這段子序列的和最大 普通做法 我們完全可以列舉法來做 即二層for迴圈,第一層列舉起點,二層列舉長度,用乙個sum來記錄當前的和。列舉完之後,最大子段和即為sum。時間複雜度 o n 2 dp做法 1 我們用乙個陣列dp i 記錄一下,...