반응형
https://www.acmicpc.net/problem/12852
dp[i] = i를 만드는 연산의 최소 횟수를 저장해줍니다.
이 값을 이용하여 dp[1]부터 dp[n]까지 만들어낸 과정을 역추적해주었습니다.
#include <iostream>
#include <algorithm>
#define INF 2147483647
using namespace std;
int n, dp[1000001] = { 0 };
int main() {
scanf("%d", &n);
for (int i = 2; i <= n; i++) {
dp[i] = INF;
if (i % 3 == 0) dp[i] = min(dp[i], dp[i / 3] + 1);
if (i % 2 == 0) dp[i] = min(dp[i], dp[i / 2] + 1);
dp[i] = min(dp[i], dp[i - 1] + 1);
}
printf("%d\n", dp[n]);
while (n > 0) {
printf("%d ", n);
int nn = n - 1;
if (n % 3 == 0 && dp[nn] > dp[n / 3]) nn = n / 3;
if (n % 2 == 0 && dp[nn] > dp[n / 2]) nn = n / 2;
n = nn;
}
}
반응형
'Algorithm' 카테고리의 다른 글
백준 3273 : 두 수의 합 (0) | 2021.11.18 |
---|---|
백준 9252 : LCS 2 (0) | 2021.11.18 |
백준 7570 : 줄 세우기 (0) | 2021.11.18 |
백준 2631 : 줄 세우기 (0) | 2021.11.18 |
백준 2098 : 외판원 순회 (0) | 2021.11.18 |