3. POSTECH Computer Algorithm Team
- 좋은 알고리즘이란 무엇일까?
- 문제의 답을 내면서, 빠르게 답을 내야 한다.
- 빠른 알고리즘을 만들려면 어떻게 해야할까?
- 연산을 최대한 줄여야 한다.
- 연산을 줄이려면 어떻게 해야 할까?
Optimization Optimization
4. POSTECH Computer Algorithm Team
Optimization
- 문제의 숨어있는 조건을 잘 살펴봐야 한다.
- 문제의 조건은 규칙을 만들고, 규칙은 문제 공간을 줄인다.
- DP는 모든 문제 공간을 특수한 규칙에 의해 채워나가는 method다.
ex) 오름차순, 내림차순, 값이 작은 것부터 등등
- 따라서, 문제 공간을 최대한 줄이는 것이 DP를 빠르게 구하는데 필요하다.
- 이를 DP Optimization이라고 한다.
5. POSTECH Computer Algorithm Team
Optimization
- 다음과 같은 DP를 생각해보자.
𝐷𝑃 𝑖 = max 𝐷𝑃 1 , 𝐷𝑃 2 , … , 𝐷𝑃 𝑖 − 1 + 𝑎[𝑖]
- DP와 a이외의 다른 memory는 없다고 가정한다.
- DP[n]을 구하는데 시간 O(n^2)이다.
Q) 만약 a[i]가 항상 0이상이라면?
6. POSTECH Computer Algorithm Team
Optimization
- 𝐷𝑃 𝑖 = max 𝐷𝑃 1 , 𝐷𝑃 2 , … , 𝐷𝑃 𝑖 − 1 + 𝑎 𝑖
- 𝐷𝑃 𝑖 ≥ max 𝐷𝑃 1 , 𝐷𝑃 2 , … , 𝐷𝑃 𝑖 − 1
- 𝐷𝑃 𝑖 − 1 ≥ max 𝐷𝑃 1 , 𝐷𝑃 2 , … , 𝐷𝑃 𝑖 − 2
- max 𝐷𝑃 1 , 𝐷𝑃 2 , … , 𝐷𝑃 𝑖 − 1 = 𝐷𝑃[𝑖 − 1]
- 𝐷𝑃 𝑖 = 𝐷𝑃 𝑖 − 1 + 𝑎[𝑖]
따라서, a[i]가 0이상이라는 조건이 있다면 이 DP를 O(n)으로 구할 수 있다.
7. POSTECH Computer Algorithm Team
Optimization
예제) 다음과 같은 DP를 생각해 보자.
𝐷𝑃 𝑖 = max 𝐷𝑃 1 , 𝐷𝑃 2 , … , 𝐷𝑃 𝑖 − 1 + 𝑎[𝑖]
a[i]가 -1이상이라는 조건이 있다면 어떻게 될까?
9. POSTECH Computer Algorithm Team
Optimization
유명한 DP Optimization들
- Convex Hull Trick
- Divide and Conquer Optimization
- Knuth Optimization
10. POSTECH Computer Algorithm Team
- Convex Hull이란? 볼록다각형의 둘레를 생각하면 된다.
- n개의 점을 둘러싸도록 고무줄을 놓고 놓았을 때, 고무줄의 모양이 Convex Hull이다.
- Convex Hull Trick과 Convex Hull은 관계 없다(?)
Convex Hull Trick Convex Hull Trick
11. POSTECH Computer Algorithm Team
Convex Hull Trick
- 다음과 같은 DP를 생각하자.
𝐷𝑃 𝑖 = min
567
𝑏 𝑗 ∗ 𝑎 𝑖 + 𝐷𝑃[𝑗]
- 이때, 다음 조건이 주어져 있다.
b 𝑖 ≥ 𝑏 𝑖 + 1 𝑓𝑜𝑟 𝑎𝑙𝑙 𝑖
- 어떻게 Optimize 할까?
12. POSTECH Computer Algorithm Team
Convex Hull Trick
- 모든 식은 b[j] * a[i] + DP[j]꼴을 하고 있다.
- a[i]는 고정된 값이다. 왜냐하면, i가 고정되어 있으니까.
- b[j] * x + DP[j]도 고정된 값이다.
- 왜냐하면, b[1]과 DP[1], b[2]와 DP[2],...는 항상 짝을 이뤄서 계산되기 때문이다.
(b[1]과 DP[2]가 같이 연산 되는 경우가 있는가?)
- b[j] * x + DP[j]는 일차 함수 형식을 띄고 있다. 그러므로, line을 관리하는 Data Structure를 생각해 보자.
13. POSTECH Computer Algorithm Team
Convex Hull Trick
- 일차함수 f1,f2,...fk가 있는 Set을 생각해 보자.
- fi의 기울기는 fi+1의 기울기보다 작다.
- 따라서, Set의 모양은 다음과 같이 된다.(예시)
f1
f2
f3
f4
14. POSTECH Computer Algorithm Team
Convex Hull Trick
- 우리가 구하려는 값은 f1(a[i]), f2(a[i]),...들의 min이다.
- 따라서, 우리는 이 Segment만 알면 바로 답을 구할 수 있다.
- 이 Segment가 Convex Hull을 닮아서 Convex Hull Trick이라 부른다.
f1
f2
f3
f4
15. POSTECH Computer Algorithm Team
Convex Hull Trick
- 만약 S = f1,f2,...,fn가 segment를 이루는 Line들의 집합이라고 하자.
- Segment 모양에 의해, fi의 기울기는 fi+1의 기울기보다 작다.
- 새로운 Line g가 insert 되었다고 가정하자.
- 문제 조건에 의해, g의 기울기는 fn보다 작다.
- 따라서, 새로운 S는 f1, f2, ..., fm, g가 될 것이다.(m<=n)
16. POSTECH Computer Algorithm Team
Convex Hull Trick
- g와 fn-1의 교점 A와 fn과 fn-1의 교점 B를 생각하자.
- B가 A보다 오른쪽에 있다면, fn은 g에 가려졌다는 의미가 된다.
- 즉, fn은 S에서 erase된다.
fn-2
fn-1
fn
g
B
A
17. POSTECH Computer Algorithm Team
Convex Hull Trick
- g가 insert가 되면, fn과 비교한다. fn이 erase되면, 다시 fn-1과 비교한다. ...
- insert 한번에 O(n) 하지만, 모든 Line은 S에 최대 1번 insert되고, 최대 1번 erase되므로,
- n번의 insert 연산을 하는데 드는 시간 O(n)
18. POSTECH Computer Algorithm Team
Convex Hull Trick
- Segment S = f1,f2,...,fn이 주어져 있다고 하자.
- min(f1(a[i]),f2(a[i]),...)를 어떻게 구할까?
- Binary Search로 O(logn)만에 가능하다. 총 n번의 search가 있으므로, 전체 O(nlogn)
Q1) 어떻게 Binary Search를 하는가?
Q2) 만약 a[i] <= a[i+1]이라는 조건이 추가로 주어지면 n번의 search를 O(n)만에 할 수 있다. 어떻게 할까?
19. POSTECH Computer Algorithm Team
- 다음과 같은 DP를 생각하자.
𝐷𝑃 𝑖 [𝑗] = min
?65
𝐷𝑃 𝑖 − 1 𝑘 + 𝐶 𝑘 [𝑗]
- 다음을 정의하자.
𝑜𝑝𝑡 𝑖 𝑗 ≔ 𝐷𝑃 𝑖 𝑗 = 𝐷𝑃 𝑖 − 1 𝑘 + 𝐶 𝑘 [𝑗]가 되게 하는 k
- 다음 조건이 주어져 있다고 하자.
𝑜𝑝𝑡 𝑖 [𝑗] ≤ 𝑜𝑝𝑡[𝑖][𝑗 + 1]
Divide and Conquer Divide and Conquer
20. POSTECH Computer Algorithm Team
Divide and Conquer
- DP[i][n/2]를 계산해보자. 그러면, opt[i][n/2]를 계산할 수 있다.
- DP[i][j] (j<n/2)를 계산하려면 k를 1에서 opt[i][n/2]까지만 보면 된다.
- DP[i][j] (j>n/2)를 계산하려면 k를 opt[i][n/2]에서 n까지만 보면 된다.
- 따라서, DP[i][1,2,...,n]을 Divide and Conquer로 O(nlogn)만에 구할 수 있다.
- 그러므로 모든 DP를 O(n^2logn)만에 구할 수 있다.
Q) opt[i][j]<=opt[i][j+1]을 어떻게 알 수 있는가?
21. POSTECH Computer Algorithm Team
Divide and Conquer
다음 두 조건을 모두 만족할 때, opt[i][j] <= opt[i][j+1]이 성립한다.
1) Quadrangle Inequality: C[a][c]+C[b][d] <= C[a][d]+C[b][c] if a<=b<=c<=d
2) Monotonicity: C[b][c] <= C[a][d] if a<=b<=c<=d
22. POSTECH Computer Algorithm Team
- 다음과 같은 DP가 있다.
𝐷𝑃 𝑖 𝑗 = min
76?65
𝐷𝑃 𝑖 𝑘 + 𝐷𝑃 𝑘 𝑗 + 𝐶 𝑖 [𝑗]
- 다음과 같은 성질이 있다고 하자.
𝑜𝑝𝑡 𝑖 − 1 𝑗 ≤ 𝑜𝑝𝑡 𝑖 𝑗 ≤ 𝑜𝑝𝑡[𝑖][𝑗 + 1]
Knuth Optimization Knuth Optimization
23. POSTECH Computer Algorithm Team
Knuth Optimization
- k를 i에서 j까지 보는 것을 opt[i-1][j]에서 opt[i][j+1]까지 보는 것으로 바꾸면 된다.
- 그러면, O(n^3) DP가 O(n^2)만에 풀린다는 것이 밝혀져 있다.
24. POSTECH Computer Algorithm Team
https://www.acmicpc.net/problem/13262
https://www.acmicpc.net/problem/7737
https://www.acmicpc.net/problem/6171
https://www.acmicpc.net/problem/13246
오늘의 문제