ブラシの質問71-卵の落下

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

 

キーテクノロジー

  1. 動的プログラミング
  2. 二分法

トピック分析

  1. dp [i] [j]は、j個の卵をj回投げて測定した卵数が最も多い床を意味します。

  2. 二分法を使って中央の床から卵を落とします。回数は+1です。

  3. 卵が壊れた場合:i-1個の卵をj-1回テストします(下の階)。

  4. 卵が壊れていない場合:i個の卵がj-1回テストされます(上階)。

  5. i-1卵j-1テストフロア+ i卵j-1テストフロア+ 1;
  6. 所以dp [i] [j] = 1 + dp [i-1] [j-1] + dp [i] [j-1];

     

  7. 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を返します。
};

  

  

おすすめ

転載: www.cnblogs.com/liu-xin1995/p/12683282.html