Menu
CoddyTech

Split Array Largest Sum

むずかしい二分探索動的計画法python iconjava iconcpp iconc iconjs icon+10

非負整数の配列 nums と整数 k が与えられます。nums をちょうど k 個の部分に分割してください。各部分は隣り合う値が連続する空でない区間であり、部分の順序は維持します。それぞれの部分には合計値があり、分割のコストはそれらの合計値の最大値です。

k 個の部分への分割で達成できる最小コストを返してください。

関数

splitArray(nums: integer-array, k: integer) → integer
numsinteger-array
順に並んだ、0以上の値
kinteger
それらを分割する連続した部分の数
戻り値integer
最大の部分和の可能な最小値

制約

  • 1 ≤ nums.length ≤ 5000
  • 0 ≤ nums[i] ≤ 105
  • 1 ≤ k ≤ nums.length
  • 各部分には少なくとも1つの値があります。値がすべて 0 の部分の合計は 0 となり、これは許容されます。

例

入力
nums = [6, 2, 9, 4, 7, 3]k = 3
出力
13
説明
[6, 2]、[9, 4]、[7, 3]に分割すると、コストは13です。コスト12で済む分割はありません。12以下で左から順に部品をまとめると、[6, 2]、[9]、[4, 7]、[3]となり、4つの部品になります。
challenge icon

発展問題

累積和を使うと、貪欲な判定では二分探索によって各部分の終点を見つけられます。k が小さい場合、手法全体の実行速度はどのくらいになるでしょうか?

コードをリセット
def splitArray(nums, k):
    # ここにコードを書いてください

テスト #1

テスト #2

テスト #3

引数

nums = [6, 2, 9, 4, 7, 3]
k = 3

期待される出力

13