티스토리 뷰

https://www.acmicpc.net/problem/2584


1. O(N^3)

dp[node][k][state] 라는 N^2 점화식을 생각해보면 서브 트리에 대해서 http://amugelab.tistory.com/entry/CCC14-Stage-2-Werewolf 의 해법으로 풀 수 있다. 복잡도는 O(N^3).


2. O(N^2)

이 문제에서 두 DP값은 DP[i] = min(DP1[j] + DP2[i-j]) 라는 방식으로 합쳐지는데, 내가 아는 한에서는 이는 O(N^2)보다 빠르게 계산할 수 없다. 아마 실제로도 계산할 수 없을 것이다. 증명은 못하지만...

고로, 뭔가 다른 걸 궁리해야 한다 생각하기 쉬운데 답은 의외로 가까이에 있다. 두 서브트리 사이즈가 A, B이고 여기서 DP배열을 O(AB)에 합칠 수 있는데. 이러한 방식으로 올라가면 T(A+B) = T(A) + T(B) + O(AB) 라는 시간이 걸리고, 이 때 T(N) = O(N^2)이다. 왜냐... 고 물으면, 트리의 각 노드쌍을 본다는 식으로 생각해보자. 노드쌍의 LCA에서는 한번의 merge 연산이 있을 것이지만, 그 외의 경우에는 완전히 다른 서브트리에 있거나 같은 서브트리에 있다. 고로 merge 연산은 각 쌍에 대해서 N^2개 있고 복잡도는 O(N^2)이다. O(AB)에 두 서브트리의 DP값을 합치는 건, 약간 tricky하긴 하지만 절대 힘들지는 않다.


이 문제를 여러개의 색에 대해서 일반화 시킨 문제가 있는데, 조금만 생각해 보면 저 문제 역시 O(N^2)에 풀 수 있다. 고민해보길..

http://www.spoj.com/problems/DRAGON2/

'공부 > Problem solving' 카테고리의 다른 글

삼각형 (CEOI 2009)  (0) 2015.10.08
점 연결하기 (BOI 2007)  (0) 2015.10.08
C++11  (0) 2015.10.03
이항계수 (nCr) mod p 계산하기  (8) 2015.09.25
Introduction to Polygon  (0) 2015.09.18
댓글
공지사항
최근에 올라온 글
Total
Today
Yesterday