달공이와 임베디드

[DP] 1로 만들기 본문

알고리즘

[DP] 1로 만들기

하일리99 2018. 9. 18. 10:41

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





문제


정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.


  • X가 3으로 나누어 떨어지면, 3으로 나눈다.

  • X가 2로 나누어 떨어지면, 2로 나눈다.

  • 1을 뺀다.


정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 


연산을 사용하는 횟수의 최솟값을 출력하시오.




입력


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




출력


첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <include>
 
 
 
using namespace std;
 
const int N = 1000001;
 
int min(int a, int b)
{
    if(a > b) return b;
    else return a;
}
 
int DP[N];
 
int make_one(int n)
{
 
    DP[1= 0;
    for(int i = 2; i <= n; i++)
    {
        DP[i] = DP[i-1+ 1;
 
        if(i%3 == 0)
            DP[i] = min(DP[i], DP[i/3+ 1);
        
        else if(i%2 == 0)
            DP[i] = min(DP[i], DP[i/2+ 1);
        
    }
    return DP[n];
}
 
 
int main()
{
    int input;
    cin >> input;
    cout << make_one(input) << endl;
    return 0;
}
cs


'알고리즘' 카테고리의 다른 글

[백준][1065] 한수  (0) 2020.05.09
[C++ 자료구조] STL deque 사용 예제  (0) 2020.05.09
[C++ 자료구조] unordered_map  (0) 2020.05.07
[C++ 자료구조] STL deque  (0) 2020.05.07
[자료구조] 인접 행렬 그래프 (DFS-Recursion)  (0) 2020.01.28
Comments