일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- hashing
- flows
- implementation
- Segment Tree
- Sieve_of_Eratosthenes
- GCD
- Euler circuit
- mathematics
- backtracking
- dynamic programming
- BOJ
- Greedy
- disjoint-set
- graph modeling
- POJ
- 백준
- graph
- Shortest path
- Euler path
- scc
- BFSDFS
- Dag
- CS Academy
- BST
- Eulerian path
- bitmask
- Eulerian circuit
- Cycle detecting
- DynamicProgramming
- Algospot
- Today
- Total
그냥 하는 노트와 메모장
BOJ 1742 레이싱 결과 본문
* BOJ 1742 레이싱 결과
[분류 : 다이나믹 프로그래밍, DAG, 그래프 이론, 조합론]
[풀이]
1. [그래프 구조] 먼저 구성되는 컴포넌트의 구조는 양방향 그래프가 아닌 DAG(Directed Acyclic Graph)이어야 한다. 즉, 사이클이 존재하면 모순이 발생하므로 경우의 수는 0이 돼야 한다.
2. [컴포넌트 집합] 하나의 컴포넌트에 여러 노드가 존재할 수 있다. 따라서 같은 컴포넌트에 있는 노드를 집합으로 둔다.
3. [진출 간선?] 나는 경기결과를 작성할 때 맨 뒤에서 시작해서 작성하는 걸 채택했다. 구성되는 dag 컴포넌트에서 진출 간선이 0인 것들부터 넣는 방식을 생각해보자. 진출 간선이 없다는 의미는 더 이상 자신이 반드시 이기는 상대가 존재하지 않는다는 뜻이다.
따라서 리프(Leaf) 노드부터 사용해나가면서 자신 부모의 진출 간선 수를 정확히 하나만 줄여주고 그 부모 진출 간선이 0이 되면 다음 위치에서 사용할 수 있도록 구성해주는 것이다
4. [여러 개의 컴포넌트] i번 컴포넌트를 계산했다고치고 그 경우의 수를 라고 하자. 또 그 컴포넌트를 이루는 노드의 수를 라면 정답은 아래 수식으로 표현할 수 있다
N개의 수를 나열해놓고 중복을 제거하는 간단한 수식이다.
5. [다이나믹 프로그래밍] 이제 값을 어떻게 계산하는지, 먼저 dp 형태를 생각해보자. 같은 컴포넌트에 대해서 진행되어야함을 생각하시고..
(1) 현재 위치
(2) 사용할 수 있는 노드 집합
위치야 30밖에 되지 않지만 집합이 문제다. 비트셋으로 표현하자니 2^30의 크기가 부담스럽고 set이나 vector로 처리하기엔 여간 까다로운게 아니다. 그래서 그냥 비트셋 + map으로 쓰면 편하다.
(다이나믹 판단 여부) 편의상 DAG가 이진 트리를 이루고 있다고 가정해보자. 이진 트리에서 가장 왼쪽 노드와 중간 노드를 각각 A, B로 둘 때, 순서를 A->B 순으로 사용할 때와 B->A로 사용하는 경우를 생각할 때 그 다음 단계에서 사용할 수 있는 노드 집합은 정확히 똑같다. 또한 다음 단계에서도 똑같은 문제를 가지고 있으며 문제 크기가 작아졌기에 최적 부분 구조를 가지고 있으며 A->B와 B->A 순 배치에 대해 같은 부분 문제를 풀어야하므로 부분 문제가 중복되기에 다이나믹 프로그래밍 이 적합하다.
아래 그림 빨간 노드는 현재 사용할 수 있는 노드, 흰색은 사용하지 않은 노드 중에서 현재 사용할 수 없는 노드, 회색은 사용된 노드를 의미한다.
|
|
그림1 : DAG 예시. 현재 사용할 수 있는 노드는 5개(A, B, 1, 2, 4) |
그림2 : A->B 또는 B->A순으로 삭제했을 때 그래프 |
6. [Modulo inverse] 마지막으로 페르마의 소정리를 이용하여 분모부분을 해결해주면 되시겠다.
'Solved problems' 카테고리의 다른 글
BOJ 4384 공평하게 팀 나누기 (1) | 2020.05.26 |
---|---|
BOJ 1410 패턴의 개수 (0) | 2020.05.25 |
BOJ 1040 정수 (0) | 2020.05.24 |
BOJ 1176 섞기 (0) | 2020.05.24 |
BOJ 1797 균형잡힌 줄서기 (0) | 2020.05.22 |