最大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...