मान लीजिए कि हमारे पास एक संख्या n है। अब एक ऑपरेशन पर विचार करें जहां हम या तो 1. घटा सकते हैं n एक से 2. यदि n सम संख्या है, तो इसे n / 2 3 से घटाएं। यदि n 3 से विभाज्य है, तो 2 * (n / 3) से कमी अंत में खोजें n से शून्य तक कम करने के लिए आवश्यक संचालन की न्यूनतम संख्या।
इसलिए, यदि इनपुट n =16 की तरह है, तो आउटपुट 5 होगा, क्योंकि n =16 फिर भी इसे n/2 4 गुना घटाता है, यह 1 होगा। फिर इसे 1 से घटाकर 0 प्राप्त करें। तो कुल 5 संचालन।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक मानचित्र डीपी परिभाषित करें
-
फ़ंक्शन को परिभाषित करें dfs(), इसमें x लगेगा,
-
रिट :=x
-
यदि x dp में है, तो -
-
वापसी डीपी [एक्स]
-
-
यदि x <=0, तो -
-
वापसी x
-
-
यदि x 1 के समान है, तो -
-
वापसी 1
-
-
एमडी2:=एक्स मॉड 2
-
एमडी3:=एक्स मॉड 3
-
ret :=न्यूनतम {ret, md2 + 1 + dfs ((x - md2) / 2), md3 + 1 + dfs ((x - md3) / 3)}
-
वापसी डीपी [एक्स] =सेवानिवृत्त
-
मुख्य विधि से कॉल करें और dfs(n)
. लौटाएं
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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);
} इनपुट
16
आउटपुट
5