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] の合計はそれぞれ8、13、10なので、コストは13です。コストが12の分割はありません。各合計を12以下にして左から順に詰めると、[6, 2]、[9]、[4, 7]、[3]となり、許されているのは3つまでなのに、4つに分かれてしまいます。

lock icon提出時に隠しテスト+20件

challenge icon

発展問題

貪欲法の各判定では、すべてのn個の値を読み取ります。累積和を使えば、代わりに二分探索で各部分の終わりを見つけられます。kが小さく、numsが長い場合、手法全体はどれくらい速くなるでしょうか?

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

ケース1

ケース2

ケース3

入力

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

期待値

13