문제 링크
- http://icpc.me/14240
사용 알고리즘
- DP
- CHT
시간복잡도
- O(N log N)
풀이
A_n = sum(S_1, S_2, S_3, … , S_n)으로 정의합시다.
비슷한 방식으로 B_n = sum(A_1, A_2, A_3, … , A_n)으로 정의합시다.
[i, j] 구간의 점수 score(i, j)는 ( A_j - A_(j-1) ) + ( A_j - A_(j-2) ) + ( A_j - A_(j-3) ) + … + ( A_j - A_(i-1) )입니다.
score(i, j) = A_j * (j-1+i) - B_(j-1) + B_(i-2)로 나타낼 수 있습니다.
dp[n]을 n으로 끝나는 부분 수열의 최댓값이라고 하면, dp[n] = max(score(i, n))입니다. (단, 1 <= i < n)
dp[n] = max( A_n * (n-i+1) - B_(n-1) + B_(i-2) )가 되고,
dp[n] = max( A_n * (-i) + B_(i-2) ) + A_n * (n+1) - B_(n-1)이 됩니다.
max() 안에 있는 식을 기울기가 -i, y절편이 B_(i-2)인 일차 함수로 나타내면 CHT를 적용할 수 있게 됩니다.
CHT를 이용해 O(N log N)만에 답을 구할 수 있습니다.
전체 코드
1 |
|