본문 바로가기
Problem Solving/KOITP

구간 나누기 - KOITP_201601_INTERVALDIVISION

by hongjun7 2017. 1. 22.

문제 링크(koitp.org/problem/KOITP_201601_INTERVALDIVISION/)

동적계획법으로 해결할 수 있다.

dp(k, i) : i번째 수까지 k개의 구간을 정했을 때의 최적해

dp(k, i) = max[dp(k-1, j) + max(A(j+1)~A(i)) - min(A(j+1)-A(i))]

여기서 max( )와 min( )을 계산하는데 O(N)이 걸려서 한 가지 변형을 한다.

dp_contain_max(k, i) = max[dp(k-1, j) + max(A(j+1)~A(i))]

dp_contain_min(k, i) = max[dp(k-1, j) - min(A(j+1)~A(i))]

그러면 dp(k, i) = max[dp_contain_max(k, i) - A(i), dp_contain_min(k, i) + A(i)]

dp_contain_max와 dp_contain_min은 dp(k, i)에서 i를 증가시키면서 같이 구해나갈 수 있다.

따라서 전체적인 시간복잡도는 O(NK)

'Problem Solving > KOITP' 카테고리의 다른 글

오크 나무 - COI_2010_HRASTOVI  (1) 2017.01.23
로다 - COCI_2016C2_SAVEZ  (0) 2017.01.22
포위 - SDS_PRO_9_5  (0) 2017.01.21
248 게임 - USACO_2016OPENGOLD_248  (0) 2017.01.21
합분해 - SDS_PRO_2_2  (0) 2017.01.21

댓글