본문 바로가기

problem solving

BOJ 13261 탈옥 (분할정복 동적계획법 최적화)

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

 

13261번: 탈옥

한 간수가 1, 2, 3번 방을, 다른 간수가 4, 5번 방을, 다른 간수가 6번 방을 감시한다고 하면 탈옥 위험도가 최소가 된다. 1, 2, 3번 방을 감시하는 간수는 총 3명의 죄수를 감시하고 있기 때문에, 1, 2,

www.acmicpc.net

컨벡스 홀 최적화 각인줄 알고 식 유도하려고 뻘짓하다가 알고 보니 너무 당연하게 분할정복 최적화였던 문제.

분할정복 최적화를 적용할 수 있는 케이스는 아래와 같다.

  • 점화식: DP[i][j] = min { DP[i-1][k] + C[k][j] } ( k < j )
  • C[k][j] 는 monge array
    • C[a][c] + C[b][d] <= C[a][d] + C[b][c] ( a <= b <= c <= d)

위의 조건을 만족하면, opt(i, j)를 위의 점화식을 최적으로 만드는 가장 작은 k라고 정의 했을 때, 모든 i, j 쌍에 대해서 다음이 성립한다.

  • opt(i, j-1) < opt(i, j)  (이 조건이 중요하다)

따라서, 어떤 i, j 쌍에 대해서 opt(i, j)를 알고 있다면 opt(i, j')을 계산 하는데 위의 식을 사용하여 최적화를 할 수 있다. 문제의 j 구간을 반씩 나눠서 분할 정복을 하면 O(n * m log m)에 문제를 해결 할 수 있다. ( i <= n, j <=m)

 

탈옥 문제의 점화식은 아래와 같다.

  • DP[i][j] = min { dp[i-1][k] + (sum[j] - sum[k]) * (j - k) }
  •   = min { dp[i-1][k] + C[j][k] } where C[j][k] = (sum[j] - sum[k]) * (j - k) 

위의 조건 opt(i, j-1) < opt(i, j) 을 만족 하므로, 분할정복 최적화를 적용할 수 있다.

https://cp-algorithms.com/dynamic_programming/divide-and-conquer-dp.html

 

Divide and Conquer DP - Competitive Programming Algorithms

Divide and Conquer DP Divide and Conquer is a dynamic programming optimization. Preconditions Some dynamic programming problems have a recurrence of this form: \[ dp(i, j) = \min_{0 \leq k \leq j} \\{ dp(i - 1, k - 1) + C(k, j) \\} \] Where \(C(k, j)\) is

cp-algorithms.com

 

'problem solving' 카테고리의 다른 글

BOJ 5466 상인 (IOI 2009 Salesman)  (0) 2022.01.12
BOJ 17399 트리의 외심  (0) 2022.01.07
BOJ 10350 은행 (IMO 1986)  (5) 2021.12.28
BOJ 13972 파일합치기2 (크누스 최적화)  (0) 2021.12.26
BOJ 8872 빌라봉  (0) 2021.12.26