最大M子段和 輔助陣列降低時間複雜度

2021-06-16 14:05:25 字數 967 閱讀 5657

最大m子段和

給定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題目**:

#include

<

cstdio

>

#include

<

algorithm

>

using

namespace

std;

const

intn

=1000010

, inf

=0x3fffffff

;int

f[n], g[n], a[n];

intmax_sum(

intm,

intn)

g[j-1]

>?=

f[j-1];

}return

g[m];

}int

main()

printf(

"%d\n

", max_sum(m, n));

}return0;

}

最大m子段和

最大m子段和問題 給定由n個整數 可能為負 組成的序列a1 a2 a3.an,以及乙個正整數m,要求確定序列的m個不想交子段,使這m個子段的總和最大!設b i,j 表示陣列a的前j項中i個子段和的最大值,並且第i個子段包含a j 1 i m,i j n 則所求的最優值為maxb m,j m j n ...

最大m子段和

51nod 1052 題意描述 給定陣列a,長度為n。給定整數m,求不相交的m段字段和的最大值。當m 1 時 該問題就是最大子段和問題。設dp i 為以a i 結尾的最大子段和,當我們考慮dp i 的時候如果dp i 1 0那麼肯定把a i 接在後面最優,否則,取a i 最優。得到 dp i max...

最大M子段和

最近掉入了dp的深淵,還附加數學知識,爽哉。在此分析一道提交了17次的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 1...