ABOUT ME

개발 및 게임, 기타 등등

Today
Yesterday
Total
  • BOJ 1463 [1로 만들기]
    알고리즘 풀이/DP(동적계획법) 2018. 9. 25. 21:31

    BOJ 1로 만들기 : https://www.acmicpc.net/problem/1463




    안녕하세요. 이번 문제는 백준 온라인 저지의 "1로 만들기" 입니다.




    우선, 정수 1에서 1로 가기위해 사용되는 연산 수는 0입니다. (arr[1] = 0)


    그 다음, 2, 3에서 1로 가기위해 사용되는 연산 수는 1입니다. (2 / 2 or 2 - 1 = 1,   3 / 3 = 1  -> arr[2], arr[3] = 1)


    4부턴 1로 가는 방법이 여러가지입니다. (4 / 2 = 2 / 2 = 1, 4 - 1 = 3 / 3 = 1 -> arr[4] = 2)





    이제부터 N에 대해 보겠습니다. 총 세 가지 값을 비교하면 됩니다.


    만약 N을 3으로 나눌 수 있으면, arr[N] = arr[N / 3] + 1이 됩니다.


    또, 2로 나눌 수 있으면 arr[N / 2] + 1이 됩니다.


    마지막으로 arr[N - 1] + 1이 있습니다.


    이 세 값을 비교해, 가장 작은 값이 arr[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
    #include <iostream>
    using namespace std;
    int main() {
        int N;
        cin >> N;
        int* arr= new int[N+1];
        arr[1= 0;
        if(N == 2) {
            arr[2= 1;
        }
        else if(N > 2){
            arr[2= 1;
            arr[3= 1;
        }
        for(int i=4; i<=N; i++) {
            int temp = 999999;
            if(i % 3 == 0) {
                if(temp > arr[i/3+ 1)
                    temp = arr[i/3+ 1;
            }
            if(i % 2 == 0) {
                if(temp > arr[i/2+ 1)
                    temp = arr[i/2+ 1;
            }
            if(temp > arr[i-1+ 1)
                temp = arr[i-1]+1;
            arr[i] = temp;
        }
        cout << arr[N];
        return 0;
    }
     
    cs


    반응형

    '알고리즘 풀이 > DP(동적계획법)' 카테고리의 다른 글

    BOJ 1005 [ACM Craft]  (2) 2021.03.10
    BOJ 11726 [2xn 타일링]  (0) 2018.09.25

    댓글

Designed by Tistory.