문제 링크
- http://icpc.me/10841
문제 출처
- 2015 KOI 고등부 3번
사용 알고리즘
- DP
- 스위핑
시간복잡도
- $O(N^2)$
풀이
DP 문제라는 것은 쉽게 알 수 있지만, 점화식을 어떻게 정의해야할지 잘 보이지 않는 문제입니다.
데이터를 정렬하고 좌표압축해서 손해볼 것은 없으니, 일단 입력으로 주어진 매트 조각들을 $(L, R)$ 오름차순으로 정렬하고 $L, R$은 좌표 압축을 해줍시다. 서로 다른 $L, R$ 값은 최대 $2N$개 존재하므로 $L, R$을 $2N$ 이하의 자연수로 표현할 수 있습니다.
x좌표가 $j$인 지점까지만 사용하고, 마지막으로 사용한 매트가 $i$번째 매트일 때 얻을 수 있는 이익의 최댓값을 $D(i, j)$라고 정의합시다.
DP 상태 전이는 다음과 같습니다. 설명의 편의를 위해 $i$번째 매트의 $L$값을 $L(i)$, $R$값을 $R(i)$, 그 매트의 가격을 $V(i)$라고 합시다.
- $D(i, j) \leftarrow D(i, j-1)$
- $i$번째 매트와 겹치지 않고, $L(k) \geq j$인 매트 $k$에 대해
- $R(i) \leq R(k)$이면 $D(k, R(i)) \leftarrow D(i, j) + V(k)$
- $R(i) \geq R(k)$이면 $D(i, R(k)) \leftarrow D(i, j) + V(k)$
$D(i, j)$를 계산한 뒤 $D(i, j+1)$로 보내줄 수 있으므로, $D(i, j)$를 계산할 때는 $L(k) \geq j$가 아닌 $L(k) = j$인 $k$만 봐도 충분합니다.
각각의 $i$에 대해, $D(i, \ast)$를 계산할 때 고려하는 $j$의 개수가 최대 $2N$개, $k$의 개수가 최대 $N$개이므로 $O(N^2)$에 점화식을 계산할 수 있습니다.
전체 코드
1 |
|