문제 링크
- http://icpc.me/15826
사용 알고리즘
- 플로이드 와샬
- 비트마스크
- 행렬 거듭 제곱
시간복잡도
- {L \choose N} \log (D-N)
풀이
현재 줄의 상태를 L개의 비트로 표현할 수 있습니다.
현재 상태 now에서 맨 위에 있는 사람이 이동해 상태를 nxt로 바꿀 때 소모하는 에너지를 W라고 할 때, now에서 nxt로 가는 간선 W짜리 간선을 만들어줍시다.
깊이가 1인 곳부터 N인 곳까지 사람이 깊이가 D-N-1부터 D인 곳으로 이동하는 것은, (맨 위 N개의 칸에 사람이 있는 상태)에서 출발해 간선 D-N개를 거쳐 다시 (맨 위 N개의 칸에 사람이 있는 상태)인 상태로 돌아오는 것이라고 생각할 수 있습니다.
인접행렬의 (D-N)제곱을 구하면, 간선을 D-N개 거쳐서 가는 최소 비용을 구할 수 있습니다. 단, 이때 행렬곱 연산은 Floyd-Warshall로 정의합니다.
$L \leq 12$라서 정점이 $2^{12}$개라고 생각할 수 있지만, 실제로 가능한 상태는 ${L \choose N}$가지 밖에 없습니다. 좌표 압축을 잘 해주면 됩니다.
전체 코드
1 |
|