반응형
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
이번문제는 dp(다이나믹 프로그래밍)를 이용하여 푸는 문제이다.
예시들을 쭉 세워보면
n = 1은 0,
n = 2는 1,
n = 3은 1,
n = 4는 2,
n = 5는 3,
n = 6은 2
이다.
위의 예시들 중 n = 6을 보면
6은 3으로도 나누어 떨어지고, 2로도 나누어 떨어진다. 따라서 6을 3으로 나눈값, 2로 나눈값, 1을 뺸값을 다 비교해보아야한다.
즉 dp[6] = min(dp[6/3], dp[6/2], dp[6-1])이다.
이를 토대로 점화식을 세워보면
dp[i] = min(dp[i/3] (i%3이 0일때), dp[i/2] (i%2가 0일때), dp[i-1])이라고 할 수 있다.
#include <iostream>
using namespace std;
int n, mn, dp[1000006];
int main() {
cin >> n;
for (int i = 2; i <= n; i++) {
int mn = 50;
if (i % 3 == 0) mn = min(mn, dp[i / 3]);
if (i % 2 == 0) mn = min(mn, dp[i / 2]);
mn = min(mn, dp[i - 1]);
dp[i] = mn + 1;
}
cout << dp[n];
}
반응형
'백준 > 일반 문제' 카테고리의 다른 글
[백준/BOJ] 2156 - 포도주 시식 (c++) (DP) (0) | 2022.04.10 |
---|---|
[백준/BOJ] 10844 - 쉬운 계단 수 (c++) (DP) (2) | 2022.04.09 |
[백준/BOJ] 11726 - 2×n 타일링 (c++) (DP) (0) | 2022.04.09 |
[백준/BOJ] 1003 - 피보나치 함수(c++) (DP) (0) | 2022.04.08 |
[백준/BOJ] 1149 - RGB거리 (c++) (DP) (0) | 2022.04.08 |