문제 링크
- http://icpc.me/10067
문제 출처
- 2014 APIO 2번
사용 알고리즘
- DP
- Convex Hull Trick
시간복잡도
- O(KN)
풀이
dp[k][n] = n번째 원소까지 k번 잘랐을 때 최대 점수
라고 정의를 하면
dp[k][n] = max( dp[k-1][i] + sum[i] * (sum[n] - sum[i]) )입니다.
dp[k][n] = max( sum[i] * sum[n] + dp[k-1][i] - sum[i] * sum[i] )로 보면, max 함수 내부의 식을 기울기가 sum[i]이고 y절편이 dp[k-1][i] - sum[i] * sum[i]인 일차함수꼴로 나타낼 수 있습니다.
Convex Hull Trick을 써줄 수 있습니다.
기울기가 같은 직선이 연속으로 들어오는 경우에는 y절편이 더 큰 직선만 남겨주면 됩니다.
MLE가 발행할 수 있는데, dp[k][]를 구할 때 dp[k-1][]만 사용한다는 점을 이용해 토글링을 해줄 수 있습니다.
정답을 역추적하는 것은, track[k][n] = dp[k][n]을 만족하는 i 처럼 정의해서 잘 따라가주면 됩니다.
전체 코드
1 |
|