Module: 動的プログラミングのパターン


Problem

3 /7


最低値の合計

Theory Click to read/hide

配列を正確に k 個のサブセグメントに分割する必要がある場合は、動的計画法で 2 番目のパラメーター (分割するセグメントの数) を追加するだけです。
つまり、次の dp を検討します。
dp[i][j] は、最初の i 個の要素を正確に j 個のセグメントに分割した場合の答えです。
無効な状態に注意してください。

ダイナミクスの再計算は同じですが、2 番目のパラメーターが考慮されます。つまり、dp[i][k] をカウントし、最後のサブセグメント j の左側の境界をソートして、dp[j - 1][k - 1] とセグメントの値を通じて dp[i][k] を再計算します。 [j;i]。

Problem

n 個の整数の配列が与えられます。次のように、k 個の空でないサブセグメント (一連の連続した要素) に分割する必要があります。
1) 配列の各要素は、正確に 1 つのサブセグメントに含まれていました。
2) 各サブセグメントに対して最小数を選択すると、すべての最小値の合計が可能な最大値になるはずです。

このパーティションのサブセグメントの値の最小値の合計を報告します。

入力:
最初の行には、n (1 <= n <= 500) と k (1 <= k <= n) の 2 つの自然数が含まれています。
2 行目には n 個の整数 (配列 ai の要素 (1 <= ai <= 105)) が含まれます。 br / >
出力:
数字を 1 つ出力してください - 問題の答えです。

例:
  <本体>
説明:
適切なパーティションの 1 つ: [4, 2]、[5]、[1, 3]。各サブセグメントの最小値の合計は 2 + 5 + 1 = 8 です。
入力 出力
5 3
4 2 5 1 3
8