본문으로 바로가기

백준 12852 - 1로 만들기 2

category BOJ 백준/Dynamic Programming 2021. 1. 4. 22:56

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

 

12852번: 1로 만들기 2

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

www.acmicpc.net

 

고려사항

  • 동적 프로그래밍을 활용하면, 가작 작은 연산 수는 쉽게 구할 수 있다.
  • 그 경로를 추적하는 것은 생각보다 어려웠다...
  • 근데 그냥 똑같은 길이의 배열하나 더 만들어서 더 최소값이 나와서,
    v의 값이 갱신 될 때, 해당 값이 어떤 수에서 왔는지 path배열에 기록해주고
    1을 만날 때 까지 쫙 뽑아주면 되는 것이 었다..

 

#include <iostream>
#include <memory.h>
using namespace std;

int memo[1000001];
int path[1000001];

int dp(int num){
    int &v = memo[num];
    if(num == 1){
        v = 0;
        path[num] = num;
        return 0;
    }

    if(v != -1){
        return v;
    }

    v = dp(num-1) + 1;
    path[num] = num - 1;
    if(num % 2 == 0){
        if(v > dp(num/2)+1){
            v = dp(num/2)+1;
            path[num] = num/2;
        }
    }
    if( num % 3 == 0){
        if(v > dp(num/3)+1){
            v = dp(num/3)+1;
            path[num] = num/3;
        }
    }

    return v;
}

int main() {
    int n, cnt;

    cin>>n;
    memset(memo,-1, 1000001*4);

    cnt = dp(n);
    cout<<cnt<<"\n";

    while(n != 1){
        cout<<n<<" ";
        n = path[n];
    }
    cout<<1;

    return 0;
}

'BOJ 백준 > Dynamic Programming' 카테고리의 다른 글

백준 09252 - LCS 2  (0) 2020.12.30
백준 02407 - 조합  (0) 2020.11.15
백준 11660 - 구간 합 구하기 5  (0) 2020.11.14
백준 02156 - 포도주 시식  (0) 2020.10.27
백준 10844 - 쉬운 계단 수  (0) 2020.10.26