#include <bits/stdc++.h>
// Memoization code
int countStepsToOne2(int n, int *dp) {
// Write your code here.
if(n<=1) return 0;
if(dp[n] != -1) return dp[n];
int x = countStepsToOne2(n-1, dp);
int y = INT_MAX, z=INT_MAX;
if(n%2==0)
y = countStepsToOne2(n/2, dp);
if(n%3==0)
z = countStepsToOne2(n/3, dp);
int ans = 1 + min(x, min(y,z));
dp[n] = ans;
return dp[n];
}
int countStepsToOne(int n) {
int *dp = new int[n+1];
for(int i=0; i<=n; i++) dp[i] = -1;
return countStepsToOne2(n,dp);
}
// iterative DP Code
int countStepsToOne(int n) {
int *dp = new int[n+1];
dp[1] = 0; // we know for n=1 ans is 0
for(int i=2; i<=n; i++){
int x = dp[i-1];
int y = INT_MAX;
int z = INT_MAX;
if(i%2 == 0 ) y = dp[i/2];
if(i%3 == 0 ) z = dp[i/3];
dp[i] = 1 + min(x, min(y,z));
}
int ans = dp[n];
delete [] dp;
return ans;
}