문제 링크
- http://icpc.me/20091
문제 출처
- 2017 IOI 연습세션 1번
사용 알고리즘
- CCW
- DP
시간복잡도
- O(N2)
풀이
먼저 오른쪽에 있는 i가 왼쪽에 있는 j를 볼 수 있는 조건을 먼저 생각해보면,
모든 k(j<k<i)에 대해 ccw(j,k,i)≥0을 만족하는 경우에 i가 j를 볼 수 있습니다. 이는 그림을 그려보면 쉽게 알 수 있습니다.
D(j,i)=[j,i] 구간의 답이라고 정의해서 답을 구해봅시다.
i를 고정시켜두고, j를 i−1부터 시작해 왼쪽으로 하나씩 이동하면서 dp table을 채울겁니다.
j를 i−1부터 1까지 보면서 left라는 변수를 하나 관리해줄건데, 이 변수는 (j,i]구간에서 i가 볼 수 있는 사람 중 가장 왼쪽의 있는 사람을 저장하고 있습니다.
만약 ccw(j,left,i)≥0이라면 당연히 i는 j를 볼 수 있으며, 추가로 (j,left)사이에 있는 사람들은 left에 가려져서 안 보인다는 것까지 알 수 있습니다.
이 정보를 이용해 ccw(j,left,i)≥0을 만족하는 j가 나올 때마다 D(j+1,left−1)을 더해가면서 dp table을 채워나갈 수 있습니다.
left는 sliding window 느낌으로 관리해줄 수 있으므로 O(N2)에 문제를 해결할 수 있습니다.
전체 코드
1 |
|