SlideShare a Scribd company logo
1 of 28
By POSTECH Computer Algorithm Team
동적 계획법 2
조승혁
Dynamic Programming 2
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://algospot.com/judge/problem/read/PACKING
- https://algospot.com/judge/problem/read/OCR
- https://algospot.com/judge/problem/read/KLIS
- https://algospot.com/judge/problem/read/DRAGON
- https://algospot.com/judge/problem/read/ZIMBABWE
- https://algospot.com/judge/problem/read/RESTORE
더 풀어보기
POSCAT
Thank you :-)

More Related Content

What's hot

Graph2
Graph2Graph2
Graph2GNGLB
 
iT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python OverviewiT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python OverviewDongmin Kim
 
Learning to remember rare events
Learning to remember rare eventsLearning to remember rare events
Learning to remember rare events홍배 김
 
2019 ppc answers
2019 ppc answers2019 ppc answers
2019 ppc answers승혁 조
 
개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow양 한빛
 

What's hot (8)

Graph2
Graph2Graph2
Graph2
 
03. dp easy
03. dp easy03. dp easy
03. dp easy
 
Digit recognizer
Digit recognizerDigit recognizer
Digit recognizer
 
iT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python OverviewiT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python Overview
 
Learning to remember rare events
Learning to remember rare eventsLearning to remember rare events
Learning to remember rare events
 
2019 ppc answers
2019 ppc answers2019 ppc answers
2019 ppc answers
 
개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow
 
Duet sol
Duet solDuet sol
Duet sol
 

Similar to DP 중급 2

03. segment tree
03. segment tree03. segment tree
03. segment tree승혁 조
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfHo Jeong Im
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity승혁 조
 
Sqrt(n) algorithm
Sqrt(n) algorithmSqrt(n) algorithm
Sqrt(n) algorithm승혁 조
 
세미나
세미나세미나
세미나Dongyi Kim
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithm[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithmNAVER D2
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)HYUNJEONG KIM
 
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이NAVER D2
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions현정 김
 
Deep Learning for Chatbot (4/4)
Deep Learning for Chatbot (4/4)Deep Learning for Chatbot (4/4)
Deep Learning for Chatbot (4/4)Jaemin Cho
 
G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)Jake Yoon
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 

Similar to DP 중급 2 (20)

03. segment tree
03. segment tree03. segment tree
03. segment tree
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdf
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity
 
Dp 1
Dp 1Dp 1
Dp 1
 
Sqrt(n) algorithm
Sqrt(n) algorithmSqrt(n) algorithm
Sqrt(n) algorithm
 
세미나
세미나세미나
세미나
 
Number theory
Number theoryNumber theory
Number theory
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithm[D2대학생세미나]lovely algrorithm
[D2대학생세미나]lovely algrorithm
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
 
자료구조01
자료구조01자료구조01
자료구조01
 
자료구조01
자료구조01자료구조01
자료구조01
 
자료구조01
자료구조01자료구조01
자료구조01
 
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions
 
Deep Learning for Chatbot (4/4)
Deep Learning for Chatbot (4/4)Deep Learning for Chatbot (4/4)
Deep Learning for Chatbot (4/4)
 
G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)
 
분할정복
분할정복분할정복
분할정복
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 

More from 승혁 조

RSS Live Slider
RSS Live SliderRSS Live Slider
RSS Live Slider승혁 조
 
Parallel binary search
Parallel binary searchParallel binary search
Parallel binary search승혁 조
 
Geometry Algorithms
Geometry AlgorithmsGeometry Algorithms
Geometry Algorithms승혁 조
 
Heavy light decomposition
Heavy light decompositionHeavy light decomposition
Heavy light decomposition승혁 조
 
Advanced segment tree
Advanced segment treeAdvanced segment tree
Advanced segment tree승혁 조
 
L-R network flow
L-R network flowL-R network flow
L-R network flow승혁 조
 
String algorithm
String algorithmString algorithm
String algorithm승혁 조
 
Tree algorithm
Tree algorithmTree algorithm
Tree algorithm승혁 조
 
05. network flow 2
05. network flow 205. network flow 2
05. network flow 2승혁 조
 
05 divide and conquer
05 divide and conquer05 divide and conquer
05 divide and conquer승혁 조
 
04. network flow 1
04. network flow   104. network flow   1
04. network flow 1승혁 조
 
04. binary search
04. binary search04. binary search
04. binary search승혁 조
 
02. binary search tree
02. binary search tree02. binary search tree
02. binary search tree승혁 조
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl승혁 조
 

More from 승혁 조 (19)

RSS Live Slider
RSS Live SliderRSS Live Slider
RSS Live Slider
 
Parallel binary search
Parallel binary searchParallel binary search
Parallel binary search
 
Geometry Algorithms
Geometry AlgorithmsGeometry Algorithms
Geometry Algorithms
 
FFT
FFTFFT
FFT
 
Heavy light decomposition
Heavy light decompositionHeavy light decomposition
Heavy light decomposition
 
Advanced segment tree
Advanced segment treeAdvanced segment tree
Advanced segment tree
 
L-R network flow
L-R network flowL-R network flow
L-R network flow
 
MCMF
MCMFMCMF
MCMF
 
NIM game
NIM gameNIM game
NIM game
 
String algorithm
String algorithmString algorithm
String algorithm
 
Tree algorithm
Tree algorithmTree algorithm
Tree algorithm
 
Number theory
Number theoryNumber theory
Number theory
 
06. sorting
06. sorting06. sorting
06. sorting
 
05. network flow 2
05. network flow 205. network flow 2
05. network flow 2
 
05 divide and conquer
05 divide and conquer05 divide and conquer
05 divide and conquer
 
04. network flow 1
04. network flow   104. network flow   1
04. network flow 1
 
04. binary search
04. binary search04. binary search
04. binary search
 
02. binary search tree
02. binary search tree02. binary search tree
02. binary search tree
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
 

DP 중급 2

  • 1. By POSTECH Computer Algorithm Team 동적 계획법 2 조승혁 Dynamic Programming 2
  • 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://algospot.com/judge/problem/read/PACKING - https://algospot.com/judge/problem/read/OCR - https://algospot.com/judge/problem/read/KLIS - https://algospot.com/judge/problem/read/DRAGON - https://algospot.com/judge/problem/read/ZIMBABWE - https://algospot.com/judge/problem/read/RESTORE 더 풀어보기