BOJ 6171 : 땅따먹기

2021. 8. 8. 10:49PS/DP

https://www.acmicpc.net/problem/6171
Naive한 dp로 먼저 생각해보자.

dp[i] = i번째 땅까지 샀을 때의 비용의 최솟값

dp[i] = min(dp[j-1]+max(w[k])*max(h[k])) (0<=j<=i && j<=k<=i)

 

이때 필수적으로 입력으로 정해진 순서를 적용해서 구하라는 말이 없으므로 w[i]에 대한 오름차순 정렬을 해보자.

 

여기서 관찰할 수 있는 게 있는데, 정렬하고 나서의 h[i]<=h[i+1]인 원소가 있으면 (w[i],h[i])는 고려 안해도 된다.

w[i]<=w[i+1] & h[i]<=h[i+1]을 만족하기에 실질적인 비용면에선 (w[i],h[i])가 무시되기 때문이다.

 

그러므로 이런 원소들을 빼주면, w[i]는 단조 증가, h[i]는 단조 감소 상태가 된다.

 

그렇다면 dp식을 좀 더 최적화할 수 있다.

dp[i] = min(dp[j-1]+w[i]*h[j]) (0<=j<=i)

 

그러나 n<=50000이기 때문에 아직 부족하다.

 

 

 

w[i], h[i]가 단조성이 있는 상태이고, 식 자체가 직선꼴로 나타나는 것을 관찰해보자.

 

그렇다면 여기서 CHT(Convex Hull Trick) 최적화를 이용하면 된다.

시복은 O(n).

 

코드

'PS > DP' 카테고리의 다른 글

BOJ 1023 : 올바른 괄호  (0) 2021.08.17
BOJ 17428 : K번째 괄호 문자열  (0) 2021.08.14
BOJ 1066 : 에이한수  (0) 2021.08.03
BOJ 22348 : 헬기 착륙장  (0) 2021.07.31
BOJ 1056 : 수  (2) 2021.07.29