algorithm/dp
boj 12852 1로 만들기 2
와이에쓰
2021. 1. 22. 22:11
https://www.acmicpc.net/problem/12852
12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
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 |