SlideShare a Scribd company logo
By POSTECH Computer Algorithm Team
DP Hard
조승혁
Contents
POSTECH Computer Algorithm Team
K번째 답 1
배낭 문제 0
Bit DP 2
POSTECH Computer Algorithm Team
- 이번 세미나는 어려운 DP들을 배웁니다.
- 이전보다 어려운, 다양한 유형의 DP들이 나옵니다!
- 그리고 답(값)만 구하는 것이 아닌, 답을 만들어내는 상황을 출력하는 문제들이 많으니, 주의하시기 바랍니다.
개요
POSTECH Computer Algorithm Team
- 기본적으로 DP문제들은 사이클이 없는 그래프입니다.
- 그리고 실제 상황을 출력하는 문제들은, 자식들 중 하나를 고르는 경우가 많습니다.(제일 작은 값, 큰 값 등)
- 사이클이 없기 때문에, 현재 문제를 풀기 위해 사용한 자식 문제가 바뀌는 경우가 없습니다.
- 그래서 어떤 자식 문제를 이용해서 답을 냈는지 저장할 수 있습니다.
- 이렇게 저장해놓은 자식들을 따라가면 실제 답을 만들어내는 상황을 만들어낼 수 있습니다.
실제 상황?
DP Hard
POSTECH Computer Algorithm Team
- 한 여행가가 가지고 가는 배낭에 담을 수 있는 무게의 최댓값이 정해져 있고, 일정 가치와 무게가 있는 짐들을
배낭에 넣을 때, 가치의 합이 최대가 되도록 짐을 고르는 방법을 찾는 문제
- 대표적인 조합 최적화 문제
- https://www.acmicpc.net/problem/12865 (가치의 합을 출력하는 문제)
- https://algospot.com/judge/problem/read/PACKING (짐들을 출력하는 문제)
배낭 문제
Knapsack
POSTECH Computer Algorithm Team
Knapsack
1. Brute force
- 각 물건은 선택되거나 안 되거나, 총 2 가지 상태가 있다.
- 2^N가지 경우 중, 조건(배낭 무게)를 만족하면서 가치가 제일 높은 것을 찾으면 된다.
- 각 경우마다 가치 합을 구해야 하므로, 시간복잡도는 O(N x 2^N)
- 당연하게도, 터진다…
POSTECH Computer Algorithm Team
Knapsack
2. 버틸 수 있는 무게 K를 이용해보자.
- 1부터 i번째 물품을 이용해서 무게 w를 만들었다고 하자.
- 무게가 w가 되려면, 1 ~ (i–1)번째 물품을 이용해서 w를 쓰고, i번째 물품을 사용하지 않거나
- 1 ~ (i-1)번째 물품을 이용해서 w – (i번째 물품의 무게)를 만들고, i번째 물품을 사용하면 된다.
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)
Code Explanation
POSTECH Computer Algorithm Team
Code
https://www.acmicpc.net/problem/12865
평범한 배낭
POSTECH Computer Algorithm Team
Knapsack
Q) 물건의 개수가 조금만 많아져도 메모리가 터진다. 메모리를 아낄 수 있는 방법이 없을까?
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’라고 한다.
Code Explanation
POSTECH Computer Algorithm Team
Code
https://www.acmicpc.net/problem/12865
평범한 배낭
POSTECH Computer Algorithm Team
- 가끔 문제에서 최대 또는 최솟값을 묻는 것이 아닌, K번째로 큰 값을 묻는 경우가 있다.
- 중복되는 부분 문제들은 메모이제이션으로 처리하는 것이 아닌, 아예 풀지 않도록 처리한다.
- https://algospot.com/judge/problem/read/MORSE
- https://algospot.com/judge/problem/read/KLIS
K번째 답
Kth solution
POSTECH Computer Algorithm Team
1. Brute force
- 총 n개의 장점, m개의 단점이 있다.
- 이들로 만들 수 있는 모스 부호는 총 n+mCn 이다.
- 모스 부호를 모두 만들고, 정렬한다. 그 중에서 k번째 모스부호를 출력하면 된다.
- 시간복잡도 O(n+mCn log(n+mCn) )
- 당연히 터진다.
MORSE
Kth solution
POSTECH Computer Algorithm Team
Kth solution
2. 잘라내기
- 앞에서 몇 개의 장점과 단점을 사용하여, a개의 장점과 b개의 단점이 남았다고 하자.
- 남은 장단점을 이용하여 만들 수 있는 모스 부호는 다음과 같다.
1. 단점으로 시작하는 모스 부호 a+b-1Ca개.
2. 장점으로 시작하는 모스 부호 a+b-1Cb개.
- 만약 k < a+b-1Cb이면, k번째 모스 부호는 장점으로 시작하는 모스 부호 중에 있고, 아니면 단점으로 시작하는
모스 부호 있다는 것을 알 수 있습니다.
- 이렇게 진행하여 장점과 단점을 모두 사용하였을 때 나오는 모스 부호가 답인 것을 알 수 있습니다.
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)
Code Explanation
POSTECH Computer Algorithm Team
Code
https://algospot.com/judge/problem/read/MORSE
MORSE
POSTECH Computer Algorithm Team
- MORSE와 똑같이 접근하면 된다.
Q) MORSE의 경우, 시작이 장점인지 단점인지를 기준으로 잘라내었다. KLIS는 무엇을 기준으로 잘라낼까?
KLIS
Kth solution
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)
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
POSTECH Computer Algorithm Team
- Bitmask를 활용하는 DP도 있다.
- https://algospot.com/judge/problem/read/RESTORE
Bit DP
Bit DP
POSTECH Computer Algorithm Team
- 결론부터 말하자면, 외판원 순회 문제(TSP)와 똑같은 문제다.
- 외판원 순회 문제(TSP) : https://www.acmicpc.net/problem/2098
Q) RESTORE문제를 외판원 순회 문제로 치환해보자.
RESTORE
Bit DP
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 쌍에 대해서 진행하면 된다.(완전 그래프)
POSTECH Computer Algorithm Team
Bit DP
1. 완전 탐색
- 1 ~ k의 word를 나열할 수 있는 모든 경우를 본다.
- 각 경우마다 overlap의 sum을 계산한다.
- (단어 길이 합) – (overlap 합)이 제일 작은 경우를 출력한다.
- overlap을 구하는데 O(k), word를 나열하는데 O(k!)
- 시간복잡도 O(k x k!)
- 당연히 터진다!
Q) 여기서 겹치는 부분 문제가 없는가?
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))
Code Explanation
POSTECH Computer Algorithm Team
Code
https://algospot.com/judge/problem/read/RESTORE
RESTORE
POSTECH Computer Algorithm Team
- https://www.acmicpc.net/problem/10937
- https://algospot.com/judge/problem/read/ZIMBABWE
더 풀어보기
POSCAT
Thank you :-)

More Related Content

PPTX
DP 중급 2
PDF
머신 러닝을 해보자 1장 (2022년 스터디)
PDF
머신 러닝을 해보자 3장 (2022년 스터디)
PPTX
Dynamic Programming : Step by Step
PDF
Dqn break
PDF
한양대 2017 hcpc advanced division 해설
PDF
인하대 프로그래밍 경진대회 - 문제풀이
PDF
Graph2
DP 중급 2
머신 러닝을 해보자 1장 (2022년 스터디)
머신 러닝을 해보자 3장 (2022년 스터디)
Dynamic Programming : Step by Step
Dqn break
한양대 2017 hcpc advanced division 해설
인하대 프로그래밍 경진대회 - 문제풀이
Graph2

Similar to 01. dp hard (20)

PDF
DP Optimization
PPTX
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
PPTX
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
PPTX
03. segment tree
PPTX
01. c and time complexity
PDF
DP 알고리즘에 대해 알아보자.pdf
PPTX
세미나
PDF
PPTX
2019 ppc answers
PDF
Sqrt(n) algorithm
PPTX
Number theory
PDF
Project#2말의여행 Hwp
PDF
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
PDF
[D2대학생세미나]lovely algrorithm
PDF
HI-ARC PS 101
PDF
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
PDF
2018 Ajou Programming Contest solutions
PDF
자료구조01
PDF
자료구조01
PDF
자료구조01
DP Optimization
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
03. segment tree
01. c and time complexity
DP 알고리즘에 대해 알아보자.pdf
세미나
2019 ppc answers
Sqrt(n) algorithm
Number theory
Project#2말의여행 Hwp
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2대학생세미나]lovely algrorithm
HI-ARC PS 101
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
2018 Ajou Programming Contest solutions
자료구조01
자료구조01
자료구조01
Ad

More from 승혁 조 (20)

PDF
RSS Live Slider
PDF
Parallel binary search
PDF
Geometry Algorithms
PDF
PDF
Heavy light decomposition
PDF
Advanced segment tree
PDF
L-R network flow
PDF
PPTX
NIM game
PPTX
분할정복
PPTX
String algorithm
PPTX
Tree algorithm
PDF
Number theory
PPTX
06. sorting
PPTX
05. network flow 2
PPTX
05 divide and conquer
PPTX
04. network flow 1
PPTX
04. binary search
PPTX
02. binary search tree
PPTX
03. dp easy
RSS Live Slider
Parallel binary search
Geometry Algorithms
Heavy light decomposition
Advanced segment tree
L-R network flow
NIM game
분할정복
String algorithm
Tree algorithm
Number theory
06. sorting
05. network flow 2
05 divide and conquer
04. network flow 1
04. binary search
02. binary search tree
03. dp easy
Ad

01. dp hard

  • 1. By POSTECH Computer Algorithm Team DP Hard 조승혁
  • 2. Contents POSTECH Computer Algorithm Team K번째 답 1 배낭 문제 0 Bit DP 2
  • 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)
  • 9. Code Explanation POSTECH Computer Algorithm Team Code https://www.acmicpc.net/problem/12865 평범한 배낭
  • 10. POSTECH Computer Algorithm Team Knapsack Q) 물건의 개수가 조금만 많아져도 메모리가 터진다. 메모리를 아낄 수 있는 방법이 없을까?
  • 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’라고 한다.
  • 12. Code Explanation POSTECH Computer Algorithm Team Code https://www.acmicpc.net/problem/12865 평범한 배낭
  • 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)
  • 17. Code Explanation POSTECH Computer Algorithm Team Code https://algospot.com/judge/problem/read/MORSE MORSE
  • 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))
  • 26. Code Explanation POSTECH Computer Algorithm Team Code https://algospot.com/judge/problem/read/RESTORE RESTORE
  • 27. POSTECH Computer Algorithm Team - https://www.acmicpc.net/problem/10937 - https://algospot.com/judge/problem/read/ZIMBABWE 더 풀어보기