BOJ

[백준][c++] 1463번: 1로 만들기

LEE MINGYU 2024. 10. 6. 16:01

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

문제 해석

  • 동적계획법을 이용하여 1로 만드는 연산의 최소값을 구한다

알고리즘 분류

  • 동적계획법(dp)

풀이

  • dp[1], dp[2], dp[3]을 미리 초기화한다
  • 점화식을 세워 n까지 연산한다

코드

#include <iostream>
#include <string>
#include <vector>
#include <cmath> 
#include <algorithm>
using namespace std;

int dp[1000001];

int main() { 
    long n;
    dp[1] = 0;
    dp[2] = 1;
    dp[3] = 1;

    cin >> n;

    for (int i=4; i<=n; i++) {
        if(i%6 == 0) {
            dp[i] = min(dp[i/3], min(dp[i/2], dp[i-1])) + 1;
        }
        else if(i%3 == 0) {
            dp[i] = min(dp[i/3], dp[i-1]) + 1;
        }
        else if(i%2 == 0) {
            dp[i] = min(dp[i/2], dp[i-1]) + 1;
        }
        else {
            dp[i] = dp[i-1] + 1;
        }
    }
    cout << dp[n];
        
    return 0;
}