मान लीजिए हमने K अंडे दिए हैं, और हमारे पास 1 से N तक N मंजिलों वाली एक इमारत है। अब प्रत्येक अंडा कार्य में समान है, और यदि कोई अंडा टूटता है, तो हम उसे दोबारा नहीं गिरा सकते।
0 और N के बीच एक मंजिल F मौजूद है, ताकि F से ऊंची मंजिल पर गिरा कोई भी अंडा टूट जाए, और मंजिल F पर या नीचे गिरा हुआ कोई भी अंडा नहीं टूटेगा। प्रत्येक चाल में, हम एक अंडा ले सकते हैं और उसे किसी भी मंजिल X से गिरा सकते हैं। X 1 से N की सीमा में है।
हमारा लक्ष्य निश्चित रूप से यह जानना है कि F का मान क्या है। तो, चालों की न्यूनतम संख्या क्या होगी जो हमें निश्चित रूप से जानने के लिए आवश्यक है कि F क्या है, F के प्रारंभिक मान की परवाह किए बिना?
इसलिए, यदि इनपुट K =2 और N =6 जैसा है, तो आउटपुट 3 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक 2डी सरणी डीपी परिभाषित करें
-
एक फ़ंक्शन हल करें () को परिभाषित करें, इसमें K, N,
लगेगा -
अगर एन <=1, तो -
-
वापसी एन
-
-
यदि K 1 के समान है, तो -
-
वापसी एन
-
-
अगर dp[K, N] -1 के बराबर नहीं है, तो -
-
वापसी डीपी [के, एन]
-
-
रिट:=एन, लो:=0, हाई:=एन
-
जबकि कम <=उच्च, करें −
-
बाएँ :=1 + हल करें(K-1, मध्य -1)
-
दाएं:=1 + हल करें (के, एन - मध्य)
-
ret :=न्यूनतम रिट और अधिकतम बाएँ और दाएँ
-
यदि बायाँ दाएँ के समान है, तो -
-
लूप से बाहर आएं
-
-
अगर बाएं <दाएं, तो:
-
कम :=मध्य + 1
-
-
अन्यथा उच्च :=मध्य - 1
-
-
वापसी डीपी [के, एन] =सेवानिवृत्त
-
मुख्य विधि से निम्न कार्य करें -
-
dp :=एक 2D सरणी बनाएं (K + 1) x (N + 1), इसे -1 से भरें
-
वापसी हल (के, एन)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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));
} इनपुट
2, 6
आउटपुट
3