반응형
문제 출처 :
https://www.acmicpc.net/problem/12852
알고리즘 분석 :
문제 해결에 필요한 사항
1. Dynamic Programming
이 문제를 풀기 전
[1463번] 1로 만들기 :: http://www.crocus.co.kr/443 문제를 먼저 풀 것을 추천한다.
위의 문제는 x값에서 1로 갈때 최단 거리를 묻고 있지만, 이번 문제는 최단 거리의 경로를 표현해달라 요구하고 있다.
결국 trace배열을 이용하여 어느 값이 갱신되었는지 확인하고, 그 갱신된 값의 경로를 trace[현재] = 추적경로로 지정해주면 된다.
나머지 설명은 위의 링크에 포함되어있으니 확인하면 될 것 같다.
소스 코드 :
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int arr[1000002]; int DP[1000002] = { 0,0,1,1 }; int trace[1000002] = { 0, 0, 1, 1 }; int main() { int n; int a, b, c, d, e, f; int empty = 100; scanf("%d", &n); for (int i = 4; i <= n; i++) { a = empty; b = empty; c = empty; d = empty; e = empty; if ((i - 1) % 3 == 0) a = DP[(i - 1) / 3] + 2; if (i % 6 == 0) b = DP[i / 3] + 1; if (i % 2 == 0) c = DP[i / 2] + 1; if (i % 3 == 0) d = DP[i / 3] + 1; e = min({DP[i - 1] + 1, DP[i - 2] + 2, DP[(i - 1) / 2] + 2, empty, empty}); DP[i] = min({a, b, c, d, e}); if (DP[i] == a) { trace[i] = (i - 1); trace[i - 1] = (i - 1) / 3; } else if (DP[i] == b) trace[i] = i / 3; else if (DP[i] == c) trace[i] = i / 2; else if (DP[i] == d) trace[i] = i / 3; else if (DP[i] == e) { if (e == DP[i - 1] + 1) trace[i] = i - 1; else if (e == DP[i - 2] + 2) { trace[i] = i - 1; trace[i - 1] = i - 2; } else { trace[i] = (i - 1); trace[i - 1] = (i - 1) / 2; } } } printf("%d\n", DP[n]); while (n != 1) { printf("%d ",n); n = trace[n]; } printf("1"); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[Codeground 31번] 프리랜서 (0) | 2017.06.29 |
---|---|
[Codeground 30번] Rectangles (0) | 2017.06.29 |
[1406번] 에디터 (0) | 2017.06.29 |
[3053번] 택시 기하학 (0) | 2017.06.28 |
[1145번] 적어도 대부분의 배수 (0) | 2017.06.28 |