문제 링크: 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