https://www.acmicpc.net/problem/12852
이 문제에 경로가 추가된 문제입니다. 경로 출력을 위해 parent배열을 사용합니다.
먼저, dp[i - 1] + 1을 하면서 parent[i]에 i - 1을 저장합니다.
그다음, i가 3의 배수이고 dp[i] > dp[i / 3]이면 dp[i]를 갱신하고 parent[i]도 i / 3으로 갱신합니다.
마지막으로, i가 2의 배수이고 dp[i] > dp[i / 2]이면 dp[i]를 갱신하고 parent[i]도 i/2로 갱신합니다.
이제 dp[N]을 출력하고, N부터 parent배열의 값들을 참조하며 출력합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <iostream> using namespace std; int dp[1000001], parent[1000001]; void func(int N) { for (int i = 2; i <= N; i++) { dp[i] = dp[i - 1] + 1; parent[i] = i - 1; if (i % 3 == 0) { if (dp[i] > dp[i / 3]) { parent[i] = i / 3; dp[i] = dp[i / 3] + 1; } } if (i % 2 == 0) { if (dp[i] > dp[i / 2]) { parent[i] = i / 2; dp[i] = dp[i / 2] + 1; } } } } void print(int v) { cout << dp[v] << '\n'; for (int i = v; i != 0; i = parent[i]) { cout << i << ' '; } cout << '\n'; } int main() { cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false); int N; cin >> N; func(N); print(N); return 0; } | cs |
'algorithm > dp' 카테고리의 다른 글
boj 2096 내려가기 (0) | 2021.01.22 |
---|---|
boj 1103 게임 (0) | 2021.01.22 |
boj 16195 1, 2, 3 더하기 9 (0) | 2021.01.22 |
boj 15993 1, 2, 3 더하기 8 (0) | 2021.01.22 |
boj 15992 1, 2, 3 더하기 7 (0) | 2021.01.22 |