728x90
https://www.acmicpc.net/problem/1463
정수 X에 사용할 수 있는 연산
1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
2. X가 2로 나누어 떨어지면, 2로 나눈다.
3. 1을 뺀다.
DP 문제
1. 3으로 나눌 때 dp[n] = dp[n/3] + 1
2. 2로 나눌 떄 dp[n] = dp[n/2] + 1
3. 1을 뺄 때 dp[n] = dp[n-1] + 1
=> n일 때 가장 작은 방법
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n;
int dp[1000001];
cin >> n;
dp[1] = 0;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + 1; //1을 뺀다
if (i % 2 == 0) //2로 나눈다
dp[i] = min(dp[i], dp[i / 2] + 1);
if (i % 3 == 0) //3으로 나눈다
dp[i] = min(dp[i], dp[i / 3] + 1);
}
cout << dp[n] << "\n";
return 0;
}
728x90