110. エッグドロップ
タイトルリンク
ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/super-egg-drop
タイトルの説明
K個の卵が手に入り、1からNまでの合計Nフロアの建物を使用できます。
それぞれの卵の機能は同じですが、卵が割れると落とせません。
Fフロアがあり、0 <= F <= Nを満たしていることがわかります。Fより上のフロアから落下する卵はすべて壊れ、Fフロアまたはそれより下から落下する卵は壊れません。
移動するたびに、卵(完全な卵がある場合)を取り、任意のフロアX(1 <= X <= Nを満たす)から投げることができます。
あなたの目標は、Fの値を正確に知ることです。
Fの初期値に関係なく、Fの値に対して決定する移動の最小数はいくつですか?
例1:
入力:K = 1、N = 2
出力:2
説明:
卵が1階から落ちました。壊れた場合、F = 0であることを知る必要があります。
そうでなければ、卵は2階から落ちました。壊れた場合は、F = 1を知っている必要があります。
壊れていない場合は、F = 2である必要があります。
したがって、最悪の場合、Fが何であるかを決定するために2度移動する必要があります。
例2:
入力:K = 2、N = 6
出力:3
例3:
入力:K = 3、N = 14
出力:4
ヒント:
1 <= K <= 100
1 <= N <= 10000
キーテクノロジー
- 動的プログラミング
- 二分法
トピック分析
-
dp [i] [j]は、j個の卵をj回投げて測定した卵数が最も多い床を意味します。
-
二分法を使って中央の床から卵を落とします。回数は+1です。
-
卵が壊れた場合:i-1個の卵をj-1回テストします(下の階)。
-
卵が壊れていない場合:i個の卵がj-1回テストされます(上階)。
-
i-1卵j-1テストフロア+ i卵j-1テストフロア+ 1;
-
所以dp [i] [j] = 1 + dp [i-1] [j-1] + dp [i] [j-1];
-
dp [i] [j]がfloor Nより大きいかどうかを判断します。大きい場合、jの回数を返すことができます。
/ ** * @param {number} K * @param {number} N * @return {number} * / var superEggDrop = function(K、N){ let dp = new Array(K + 1).fill(0) .map(()=> new Array(N + 1).fill(0)); for(let j = 1; j <= N; j ++){ for(let i = 1; i <= K; i ++){ dp [i] [j] = 1 + dp [i-1] [j-1 ] + dp [i] [j-1]; if(dp [i] [j]> = N){ return j; } } } Nを返します。 };