2016. 1. 10. 00:00ㆍ알고리즘 문제풀기/올림피아드 풀이
ojuz 링크
Baekjoon Online Judge 링크
먼저 해야 할 observation은, 최종적인 점수에 관한 것이다.
쪼개진 \(k+1\)개의 부분의 각각의 합을 \(s_{1}, s_{2}, \cdots , s_{k+1}\)이라고 할 때, 점수는 \( \large \displaystyle{\sum_{1 \leq i<j \leq (k+1) }} s_{i} s_{j} \)이다.
증명은 간단하다. 임의의 두 원소가 다른 그룹에 속할 때, 그 둘이 서로 다른 그룹으로 쪼개지는 순간이 있고, 그 순간의 곱에는 그 두 원소의 곱이 포함되어있다.
이 식을 조금 더 정리해보자.
$$ \begin{align} \sum_{1 \leq i<j \leq (k+1)} s_{i} s_{j} &= \frac {\displaystyle{\sum_{i=1}^{k+1}} \displaystyle{\sum_{j=1}^{k+1}} (s_{i} s_{j}) - \sum_{t=1}^{k+1} {(s_{t})}^{2} }{2}\\ &= \frac {(\sum s_{i})^{2} - \sum (s_{i})^{2}}{2} \end{align} $$
마지막에 간단한 식이 나왔다. (분자는 항상 짝수임은 자명하다!)
앞의 항은 전체 원소의 합의 제곱과 같기 때문에, 점수를 최대화하기 위해서는 뒤의 항을 최소화시켜야 한다.
뒤의 항은 DP로 최소화시킬 수 있을 것 같지 않은가?!
prefix sum 배열 \(S_{i}\)를 잡자.
\( dp[0][0]=0, dp[0][i]=\infty \\
\begin{align} dp[t][i] &= \min_{0 \leq j < i} (dp[t-1][j] + (S_{i}-S_{j})^{2}) = \min_{0 \leq j < i} (dp[t-1][j] + (S_{i})^{2}-2S_{i}S_{j}+(S_{j})^{2}) \\
&= S_{i}^{2} + \min_{0 \leq j < i} (-2S_{i}S_{j}+(dp[t-1][j]+(S_{j})^{2})) \end{align} \)
따라서 모든 \(t\)에 대해서 convex hull trick을 적용할 수 있다.
시간복잡도는 \(O(NK)\) 혹은 \(O(NlgN \cdot K)\)이다. (convex hull trick의 구현에 따라 달라진다.)
'알고리즘 문제풀기 > 올림피아드 풀이' 카테고리의 다른 글
JOI Spring Camp 2016 문제 (0) | 2017.01.20 |
---|---|
Japanese Olympiad in Informatics (0) | 2017.01.15 |
[IZhO] 2013 Day 1 D번 - 특수한 그래프 (0) | 2016.01.08 |
APIO 15 Prob 1. Bali Sculptures (0) | 2016.01.06 |
IOI 2011 Day 1 Task 1 : Tropical Garden(열대 식물원) (0) | 2014.08.14 |