https://www.acmicpc.net/problem/12852

 

12852번: 1로 만들기 2

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.

www.acmicpc.net

emoney96.tistory.com/2

 

boj 1463 1로 만들기

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 시험삼아 포스팅하는 문제로, 간단한 dp 문제입니다. 정수 X에..

emoney96.tistory.com

이 문제에 경로가 추가된 문제입니다. 경로 출력을 위해 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

+ Recent posts