3. POSTECH Computer Algorithm Team
- 이번 세미나는 어려운 DP들을 배웁니다.
- 이전보다 어려운, 다양한 유형의 DP들이 나옵니다!
- 그리고 답(값)만 구하는 것이 아닌, 답을 만들어내는 상황을 출력하는 문제들이 많으니, 주의하시기 바랍니다.
개요
4. POSTECH Computer Algorithm Team
- 기본적으로 DP문제들은 사이클이 없는 그래프입니다.
- 그리고 실제 상황을 출력하는 문제들은, 자식들 중 하나를 고르는 경우가 많습니다.(제일 작은 값, 큰 값 등)
- 사이클이 없기 때문에, 현재 문제를 풀기 위해 사용한 자식 문제가 바뀌는 경우가 없습니다.
- 그래서 어떤 자식 문제를 이용해서 답을 냈는지 저장할 수 있습니다.
- 이렇게 저장해놓은 자식들을 따라가면 실제 답을 만들어내는 상황을 만들어낼 수 있습니다.
실제 상황?
DP Hard
5. POSTECH Computer Algorithm Team
- 한 여행가가 가지고 가는 배낭에 담을 수 있는 무게의 최댓값이 정해져 있고, 일정 가치와 무게가 있는 짐들을
배낭에 넣을 때, 가치의 합이 최대가 되도록 짐을 고르는 방법을 찾는 문제
- 대표적인 조합 최적화 문제
- https://www.acmicpc.net/problem/12865 (가치의 합을 출력하는 문제)
- https://algospot.com/judge/problem/read/PACKING (짐들을 출력하는 문제)
배낭 문제
Knapsack
6. POSTECH Computer Algorithm Team
Knapsack
1. Brute force
- 각 물건은 선택되거나 안 되거나, 총 2 가지 상태가 있다.
- 2^N가지 경우 중, 조건(배낭 무게)를 만족하면서 가치가 제일 높은 것을 찾으면 된다.
- 각 경우마다 가치 합을 구해야 하므로, 시간복잡도는 O(N x 2^N)
- 당연하게도, 터진다…
7. POSTECH Computer Algorithm Team
Knapsack
2. 버틸 수 있는 무게 K를 이용해보자.
- 1부터 i번째 물품을 이용해서 무게 w를 만들었다고 하자.
- 무게가 w가 되려면, 1 ~ (i–1)번째 물품을 이용해서 w를 쓰고, i번째 물품을 사용하지 않거나
- 1 ~ (i-1)번째 물품을 이용해서 w – (i번째 물품의 무게)를 만들고, i번째 물품을 사용하면 된다.
8. POSTECH Computer Algorithm Team
Knapsack
즉, 1 ~ i번째 물건을 이용해서 무게 w를 만들었을 때, 가치의 최댓값은 다음과 같이 구할 수 있다.
- D[i][w] = max(D[i – 1][w], D[i – 1][w – (i번째 물건의 무게)] + (i번째 물건의 가치))
- 1 <= i <= N, 0 <= w <= K에 대해 진행하면 된다.
- 위 범위에서 시행했을 때, D[i][w]의 최댓값을 답으로 출력하면 된다.
- 시간복잡도 O(NK)
11. POSTECH Computer Algorithm Team
Knapsack
A) D[K] 배열만 잡아도 충분히 문제를 풀 수 있다.
- 생각해보면, D[i][w]는 D[i – 1][1…w]의 값만을 필요로 한다
- 즉, i번째 물품의 가치 값들을 다 구하면 i – 1번째 물품에 대한 가치 값들은 필요가 없어진다.
- 따라서 D[K]배열에 덮어씌우는 식으로 진행할 수 있다.
- 이렇게 하면 메모리를 1/N 만큼 아낄 수 있다!
- 이를 ‘sliding window’라고 한다.
13. POSTECH Computer Algorithm Team
- 가끔 문제에서 최대 또는 최솟값을 묻는 것이 아닌, K번째로 큰 값을 묻는 경우가 있다.
- 중복되는 부분 문제들은 메모이제이션으로 처리하는 것이 아닌, 아예 풀지 않도록 처리한다.
- https://algospot.com/judge/problem/read/MORSE
- https://algospot.com/judge/problem/read/KLIS
K번째 답
Kth solution
14. POSTECH Computer Algorithm Team
1. Brute force
- 총 n개의 장점, m개의 단점이 있다.
- 이들로 만들 수 있는 모스 부호는 총 n+mCn 이다.
- 모스 부호를 모두 만들고, 정렬한다. 그 중에서 k번째 모스부호를 출력하면 된다.
- 시간복잡도 O(n+mCn log(n+mCn) )
- 당연히 터진다.
MORSE
Kth solution
15. POSTECH Computer Algorithm Team
Kth solution
2. 잘라내기
- 앞에서 몇 개의 장점과 단점을 사용하여, a개의 장점과 b개의 단점이 남았다고 하자.
- 남은 장단점을 이용하여 만들 수 있는 모스 부호는 다음과 같다.
1. 단점으로 시작하는 모스 부호 a+b-1Ca개.
2. 장점으로 시작하는 모스 부호 a+b-1Cb개.
- 만약 k < a+b-1Cb이면, k번째 모스 부호는 장점으로 시작하는 모스 부호 중에 있고, 아니면 단점으로 시작하는
모스 부호 있다는 것을 알 수 있습니다.
- 이렇게 진행하여 장점과 단점을 모두 사용하였을 때 나오는 모스 부호가 답인 것을 알 수 있습니다.
16. POSTECH Computer Algorithm Team
Kth solution
점화식은 다음과 같다.
D(a, b, k) : 장점 a개, 단점 b개로 만들 수 있는 모스 부호들 중 k번째.
= ‘-’ + D(a – 1, b, k) (n > 0 and k <= a+b-1Cb)
= ‘o’ + D(a, b – 1, k – a+b-1Cb) (else)
18. POSTECH Computer Algorithm Team
- MORSE와 똑같이 접근하면 된다.
Q) MORSE의 경우, 시작이 장점인지 단점인지를 기준으로 잘라내었다. KLIS는 무엇을 기준으로 잘라낼까?
KLIS
Kth solution
19. POSTECH Computer Algorithm Team
Kth solution
A) i번째 수를 시작으로 하는 LIS 수로 잘라내면 된다.
- Count[i] : i번째 수를 시작으로 하는 LIS 수
- Lis[i] : i번째 수를 시작으로 하는 LIS의 길이
- Lis[i] = max(Lis[j] where i<j and S[i]<S[j]) + 1
- Count[i] = sum(Count(j) where i<j and S[i]<S[j] and Lis[i]=Lis[j]+1)
20. POSTECH Computer Algorithm Team
Kth solution
- 구해놓은 Lis, Count를 이용하면 다음과 같이 k번째 LIS를 구할 수 있다.
Kth(i,skip) : i번째 수를 시작으로 하는 LIS 중 skip 번째 LIS.
= S[i] + Kth(j, skip – Count(j))
여기서 j는
- i<j, S[i]<S[j], Lis[i]=Lis[j]+1 를 만족하고,
- sum(Count(i…j) 중 앞의 조건을 만족하는 index들) > skip 중 가장 작은 j
21. POSTECH Computer Algorithm Team
- Bitmask를 활용하는 DP도 있다.
- https://algospot.com/judge/problem/read/RESTORE
Bit DP
Bit DP
22. POSTECH Computer Algorithm Team
- 결론부터 말하자면, 외판원 순회 문제(TSP)와 똑같은 문제다.
- 외판원 순회 문제(TSP) : https://www.acmicpc.net/problem/2098
Q) RESTORE문제를 외판원 순회 문제로 치환해보자.
RESTORE
Bit DP
23. POSTECH Computer Algorithm Team
Bit DP
A)
- 각 word를 정점으로 한다.
- i번째 word 다음에 j번째 word가 온다고 하자. 이러면 i번째 word의 접미사와 j번째 word의 접두사 일부가 겹칠
것이다. 이를 overlap(i, j)라고 하자.
- ex) word, rdii => overlap(word, rdii) = 2
- i번째 word와 j번째 word를 잇는 간선의 비용을 overlap(i, j)로 정의하면 된다.
- 이를 모든 word 쌍에 대해서 진행하면 된다.(완전 그래프)
24. POSTECH Computer Algorithm Team
Bit DP
1. 완전 탐색
- 1 ~ k의 word를 나열할 수 있는 모든 경우를 본다.
- 각 경우마다 overlap의 sum을 계산한다.
- (단어 길이 합) – (overlap 합)이 제일 작은 경우를 출력한다.
- overlap을 구하는데 O(k), word를 나열하는데 O(k!)
- 시간복잡도 O(k x k!)
- 당연히 터진다!
Q) 여기서 겹치는 부분 문제가 없는가?
25. POSTECH Computer Algorithm Team
Bit DP
2. DP
- 몇몇 정점들을 돌고, 도착한 정점을 here라고 하자.
- 남은 정점들의 list를 left라고 하자.
- 생각해보면, (here, left)를 만족하는 최단 경로를 구하는 것은 앞에 지나온 정점들과 무관하다.
- 즉, 한 번 구하면 계속 사용할 수 있다 => DP
- 따라서 다음과 같이 점화식을 만들 수 있다.
D(here, left) : 시작점을 here로 하고, 남은 정점 left를 도는 경로 중, overlap의 합이 제일 작은 경로
= max(overlap(here, next) + D(next, left – next))