সমস্যা বিবরণ
একটি সংখ্যা n দেওয়া আছে। তিনটি অপারেশন করতে পারেন:
n = n - 1- যদি
nসম হয়:n = n - n/2 - যদি
n৩ দিয়ে বিভাজ্য হয়:n = n - 2*(n/3)
n কে ০ করার ন্যূনতম অপারেশন সংখ্যা বের করতে হবে।
উদাহরণ: n = 16 → আউটপুট 5 (৪বার n/2 কমিয়ে ১, তারপর ১ কমিয়ে ০)।
সমাধানের পদ্ধতি
ডাইনামিক প্রোগ্রামিং + মেমোইজেশন (রিকার্শন):
dp[x]=xকে ০ করার ন্যূনতম অপারেশন।- বেস কেস:
x <= 0 → 0,x == 1 → 1। - ট্রানজিশন:
md2 = x % 2,md3 = x % 3ret = min(x, md2 + 1 + dfs((x-md2)/2), md3 + 1 + dfs((x-md3)/3))
- মেমোইজেশন দিয়ে পুনরাবৃত্তি এড়ান।
উদাহরণ কোড
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, int> dp;
int dfs(int x) {
int ret = x;
if (dp.count(x)) return dp[x];
if (x <= 0) return x;
if (x == 1) return 1;
int md2 = x % 2;
int md3 = x % 3;
ret = min({ret, md2 + 1 + dfs((x - md2) / 2), md3 + 1 + dfs((x - md3) / 3)});
return dp[x] = ret;
}
int solve(int n) { return dfs(n); }
int main() {
int n = 16;
cout << solve(n);
return 0;
}
ইনপুট ও আউটপুট
ইনপুট: 16
আউটপুট: 5