문제 링크: https://www.acmicpc.net/problem/12852
dp 역추적 문제입니다. 1로 만들기라는 문제에 역추적만 추가된 버전입니다.
이전값으로 가는 값을 배열을 만들어주고 업데이트 해주면 됩니다
#include <bits/stdc++.h>
using namespace std;
int dp[1000001];
int before[1000001];
int solve(int x) {
dp[1] = 0;
before[1] = -1;
for (int i = 2; i <= x; ++i) {
dp[i] = dp[i - 1] + 1;
before[i] = i - 1;
if (i % 2 == 0 && dp[i] > dp[i / 2] + 1) {
dp[i] = dp[i / 2] + 1;
before[i] = i / 2;
}
if (i % 3 == 0 && dp[i] > dp[i / 3] + 1) {
dp[i] = dp[i / 3] + 1;
before[i] = i / 3;
}
}
return dp[x];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int n;
cin >> n;
cout << solve(n) << '\n';
while (n != -1) {
cout << n << ' ';
n = before[n];
}
cout << '\n';
return 0;
}
바텀업 방식으로 풀었습니다
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 2470: 두 용액 (0) | 2020.07.08 |
---|---|
[백준][C++] 1987: 알파벳 (0) | 2020.07.08 |
[백준][C++] 2170: 선 긋기 (0) | 2020.07.08 |
[백준][C++] 3425: 고스택 (0) | 2020.07.07 |
[백준][C++] 9177: 단어 섞기 (0) | 2020.07.07 |