그냥 하는 노트와 메모장

BOJ 1742 레이싱 결과 본문

Solved problems

BOJ 1742 레이싱 결과

coloredrabbit 2020. 5. 25. 20:51

* 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
Comments