問題の説明
あなたは取得しますK
卵を、1から使用可能1
にN
合計N
階建ての建物。
それぞれの卵の機能は同じですが、卵が割れると落とせません。
あなたは床が知っているF
満たすために0 <= F <= N
すべての卵からF上の階から分解されF
、その床や床の卵が壊れていないだろうよりも低く落ちるが。
それぞれの動きは、あなたが(あなたが完全に卵を持っている場合)、卵を取り、あらゆる床からそれを取ることができますX
(満たすために低下しました1 <= X <= N
)。
あなたの目標は、正確に把握することでF
価値があります。
関係なくF
どのように初期値の、あなたが決めるF
動き値の最小数はどのくらいですか?
問題解決レポート
はi
、卵とj
床に必要な最小オペランドがあることを意味します。
伝達方程式は次のとおりです。
気づいた
と
のサイズは、
次のように反対方向に変化します。
をできるだけ小さくし、
可能な限り等しい
ので、二分法を使用してこれを適切に見つけることができます
値。
以下の最適化手法の多くは継続されます。。。
実装コード
class Solution {
public:
int superEggDrop(int K, int N) {
vector<vector<int>> dp(K + 1, vector<int>(N + 1));
for (int j = 1; j <= N; ++j) dp[1][j] = j;
for (int i = 2; i <= K; ++i) {
for (int j = 1; j <= N; ++j) {
dp[i][j] = j;
int left = 1, right = j;
while (left < right) {
int mid = left + (right - left) / 2;
if (dp[i - 1][mid - 1] < dp[i][j - mid]) left = mid + 1;
else right = mid;
}
dp[i][j] = min(dp[i][j], max(dp[i - 1][right - 1], dp[i][j - right]) + 1);
}
}
return dp[K][N];
}
};