ধরুন আমরা K ডিম দিয়েছি, এবং আমাদের কাছে 1 থেকে N তলা বিশিষ্ট একটি বিল্ডিং আছে। এখন প্রতিটি ডিমের কার্যকারিতা একই, এবং যদি একটি ডিম ভেঙ্গে যায়, আমরা তা আবার ফেলে দিতে পারি না।
0 এবং N-এর মধ্যে একটি ফ্লোর F রয়েছে যাতে F-এর চেয়ে উপরে ফ্লোরে ফেলে দেওয়া যে কোনও ডিম ভেঙে যায় এবং F তলায় বা নীচে ফেলে দেওয়া কোনও ডিম ভেঙে যায় না। প্রতিটি পদক্ষেপে, আমরা একটি ডিম নিতে পারি এবং এটিকে যেকোন ফ্লোর X থেকে ফেলে দিতে পারি। X এর রেঞ্জ 1 থেকে N।
আমাদের লক্ষ্য হল নিশ্চিতভাবে জেনে রাখা যে F এর মান কী। সুতরাং, F-এর প্রাথমিক মান নির্বিশেষে, F কী তা আমাদের নিশ্চিতভাবে জানতে হবে সর্বনিম্ন কতগুলি চাল?
সুতরাং, ইনপুট যদি K =2 এবং N =6 এর মত হয়, তাহলে আউটপুট হবে 3।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি 2D অ্যারে ডিপি
সংজ্ঞায়িত করুন -
একটি ফাংশন সল্ভ() সংজ্ঞায়িত করুন, এটি কে, এন,
নেবে -
যদি N <=1, তাহলে −
-
ফেরত N
-
-
K যদি 1 এর সমান হয়, তাহলে −
-
ফেরত N
-
-
যদি dp[K, N] -1 এর সমান না হয়, তাহলে −
-
dp[K, N>
ফেরত দিন
-
-
ret :=N, low :=0, high :=N
-
যখন কম <=উচ্চ, করুন −
-
বাম :=1 + সমাধান (কে - 1, মধ্য - 1)
-
ডান :=1 + সমাধান (K, N - মধ্য)
-
ret :=সর্বনিম্ন ret এবং সর্বোচ্চ বাম এবং ডান
-
যদি বাম ডানের সমান হয়, তাহলে −
-
লুপ থেকে বেরিয়ে আসুন
-
-
যদি বামে <ডান, তারপর:
-
নিম্ন :=মধ্য + 1
-
-
অন্যথায় উচ্চ :=মধ্য - 1
-
-
রিটার্ন dp[K, N] =ret
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
dp :=একটি 2D অ্যারে তৈরি করুন (K + 1) x (N + 1), এটি -1 দিয়ে পূরণ করুন
-
রিটার্ন সলভ(K, N)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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