본문으로 바로가기

출처 : https://www.acmicpc.net/problem/1463 

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

고려사항

- 2와 3중 나눗셈이 가능하다면 dp 연산.

- -1 연산은 항상!

 

#include <iostream>
#include <algorithm>
using namespace std;
int n;
int memo[1000001];
int dp(int num){
int &v = memo[num];
int nextV = 1000000;
if(num == 1){
v = 0;
return v;
}else if(num == 2){
v = 1;
return v;
}else if(num == 3){
v = 1;
return v;
}
if(v != 0){
return v;
}
if(num % 2 == 0){
nextV = min(nextV, dp(num/2)+1);
}
if(num % 3 == 0){
nextV = min(nextV, dp(num/3)+1);
}
nextV = min(nextV, dp(num-1)+1);
v = nextV;
return v;
}
int main() {
cin>>n;
cout<<dp(n);
return 0;
}