Giả sử chúng ta đã cho K quả trứng và chúng ta có một tòa nhà có N tầng từ 1 đến N. Bây giờ, mỗi quả trứng đều giống hệt nhau về chức năng và nếu quả trứng bị vỡ, chúng ta không thể thả lại.
Tồn tại tầng F có từ 0 đến N sao cho bất kỳ quả trứng nào được thả ở tầng cao hơn tầng F sẽ bị vỡ và bất kỳ quả trứng nào được thả ở tầng F hoặc thấp hơn sẽ không bị vỡ. Trong mỗi lần di chuyển, chúng ta có thể lấy một quả trứng và thả nó từ bất kỳ tầng nào X. Dấu X nằm trong phạm vi từ 1 đến N.
Mục tiêu của chúng ta là biết chắc chắn giá trị của F là bao nhiêu. Vì vậy, số lần di chuyển tối thiểu mà chúng ta cần biết chắc chắn F là bao nhiêu, bất kể giá trị ban đầu của F là bao nhiêu?
Vì vậy, nếu đầu vào là K =2 và N =6, thì đầu ra sẽ là 3.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một dp mảng 2D
-
Xác định một hàm giải quyết (), điều này sẽ nhận K, N,
-
nếu N <=1, thì -
-
trả về N
-
-
nếu K giống với 1, thì -
-
trả về N
-
-
nếu dp [K, N] không bằng -1 thì -
-
trả về dp [K, N]
-
-
ret:=N, thấp:=0, cao:=N
-
trong khi thấp <=cao, làm -
-
left:=1 + giải quyết (K - 1, giữa - 1)
-
phải:=1 + giải quyết (K, N - giữa)
-
ret:=tối thiểu ret và tối đa trái và phải
-
nếu bên trái giống bên phải, thì -
-
Ra khỏi vòng lặp
-
-
nếu trái
-
thấp:=mid + 1
-
-
nếu không thì cao:=mid - 1
-
-
return dp [K, N] =ret
-
Frm phương thức chính thực hiện như sau -
-
dp:=Tạo một mảng 2D (K + 1) x (N + 1), điền vào giá trị này bằng -1
-
trả về giải quyết (K, N)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<vector<int>> dp;
int solve(int K, int N) {
if (N <= 1)
return N;
if (K == 1)
return N;
if (dp[K][N] != -1)
return dp[K][N];
int ret = N;
int low = 0;
int high = N;
while (low <= high) {
int mid = low + (high - low) / 2;
int left = 1 + solve(K - 1, mid - 1);
int right = 1 + solve(K, N - mid);
ret = min(ret, max(left, right));
if (left == right)
break;
if (left < right) {
low = mid + 1;
} else
high = mid - 1;
}
return dp[K][N] = ret;
}
int superEggDrop(int K, int N) {
dp = vector<vector<int>>(K + 1, vector<int>(N + 1, -1));
return solve(K, N);
}
};
main(){
Solution ob;
cout << (ob.superEggDrop(2,6));
} Đầu vào
2, 6
Đầu ra
3