SlideShare a Scribd company logo
1 of 47
Download to read offline
DP(Knapsack, Tree DP)
황준호
junodeveloper
진행 순서
• Knapsack
• Tree DP
Knapsack Problem
Knapsack Problem
출처 : Wikipedia
Knapsack Problem의 종류
• Fractional Knapsack
– 물건을 쪼갤 수 있다
• 0/1 Knapsack
– 물건을 쪼갤 수 없다
– Unbounded Knapsack (물건의 개수가 무한)
– Bounded Knapsack (물건의 개수가 유한)
Fractional Knapsack
• 부피가 𝑣𝑖이고, 단위 부피당 𝑐𝑖의 맛을 내
는 𝑛개의 빵이 있다. 부피가 𝑉인 가방에 최
대한 맛있는 빵을 담고 싶다. 빵을 자를 수
있다고 할 때, 맛의 합의 최대값은?
Fractional Knapsack
• Greedy 해법
– 𝑐𝑖	/	𝑣𝑖가 큰 빵부터 가방에 집어넣는다.
– 𝑉를 초과하면 잘라서 집어넣는다.
• 시간복잡도 O(𝑛𝑙𝑜𝑔𝑛)
0/1 Knapsack
• http://www.spoj.com/problems/KNAPSACK/
0/1 Knapsack
• DP 풀이
– 𝑑𝑝[𝑖][𝑗]	: 1 ~ i번 물건을 고려하여 크기의 합이 j가 되도
록 선택했을 때 가치의 최대값
– 𝑑𝑝[0][0]	= 	0, 	𝑑𝑝[0][𝑖]	=	−∞		(	0	 < 	𝑖	 <= 	𝑛	)
– 𝑑𝑝[𝑖][𝑗]	=
	9
𝑑𝑝[𝑖	– 	1][𝑗]		(	𝑗	 < 	𝑠 𝑖 )
max	( 𝑑𝑝[𝑖	– 	1][𝑗], 𝑑𝑝[𝑖	– 	1][𝑗	– 	𝑠[𝑖]]	+ 	𝑣[𝑖])	(	𝑗	 >= 	𝑠[𝑖]	)
시간복잡도 : O(𝑛𝑆) 공간복잡도 : O(𝑛𝑆)
0/1 Knapsack
0/1 Knapsack
• 슬라이딩 윈도(Sliding window) 기법
– 행 또는 열을 swapping하여 공간복잡도를 줄
이는 방법
– 𝑛𝑆 => 2𝑆로 최적화 가능
0/1 Knapsack
ii - 1
𝑑𝑝[𝑖][𝑗]𝑑𝑝[𝑖	– 	1][𝑗]
𝑑𝑝[𝑖	– 	1][𝑗	– 	𝑠𝑖]
0/1 Knapsack
• 현재 행 => 𝑖	%	2, 이전 행 => 1	– 	𝑖	%	2
0/1 Knapsack
• 2𝑆 => 𝑆로 최적화 가능!
ii - 1
j
ii - 1
j
j 진행 방향
0/1 Knapsack
0/1 Knapsack
• 크기가 각각 1, 2, … , 𝑆이면서 가치가 0인 𝑆
개의 물건이 존재한다고 가정
Unbounded Knapsack
• 무게와 가격이 각각 𝑤𝑖와 𝑣𝑖인 𝑛개의 물건
이 있다. 무게의 총합이 𝑊를 초과하지 않
도록 물건을 선택했을 때, 가격 총합의 최
대값을 구하라. (단, 같은 종류의 물건을 몇
개라도 고르는 것이 가능하다)
• 1	 <= 	𝑛	 <= 	1000
• 1	 <= 	𝑤𝑖, 𝑣𝑖	 <= 	1000
• 1	 <= 	𝑊	 <= 	10000
Unbounded Knapsack
• 𝑑𝑝[𝑖][𝑗]	: 1	~	𝑖번 물건을 고려하여 무게 합이
𝑗가 되도록 선택했을 때 최대 가격
• 𝑑𝑝[0][0]	= 	0, 𝑑𝑝[0][𝑖]	=	−∞	(0	 < 	𝑖	 <= 	𝑛)
• 𝑑𝑝[𝑖][𝑗]	= 	max	( 𝑑𝑝[𝑖	– 	1][𝑗	– 	𝑘	 ∗ 	𝑠𝑖]	+	
𝑘	 ∗ 	𝑣𝑖)						(𝑘	 >= 	0)
시간복잡도 O(𝑛𝑊K
)
𝐾를 없앨 수는 없을까?
Unbounded Knapsack
• 𝑑𝑝[𝑖][𝑗]
= max 𝑑𝑝 𝑖	– 	1 𝑗	– 	𝑘	 ∗ 	𝑠𝑖 + 	𝑘	 ∗ 	𝑣𝑖
(𝑘 ≥ 0)
= max( 𝑑𝑝 𝑖	– 	1 𝑗 , 	max( 𝑑𝑝 𝑖	– 	1 𝑗	– 	𝑘	 ∗ 	𝑠𝑖
+ 	𝑘	 ∗ 	𝑣𝑖))						(𝑘 ≥ 1)
= max( 𝑑𝑝 𝑖	– 	1 𝑗 , 	max( 𝒅𝒑 𝒊	– 	𝟏 𝒋	– 	𝒔𝒊 – 	𝒌	 ∗ 	𝒔𝒊
+ 	𝒌	 ∗ 	𝒗𝒊) + 	𝑣𝑖)			(𝑘 ≥ 0)
= 	max	( 𝑑𝑝[𝑖	– 	1][𝑗], 𝑑𝑝[𝑖][𝑗	– 	𝑠𝑖]	+ 	𝑣𝑖)
Unbounded Knapsack
• 𝑑𝑝[𝑖	– 	1][𝑗	– 	𝑠𝑖]	=> 	𝑑𝑝[𝑖][𝑗	– 	𝑠𝑖]
Unbounded Knapsack
Unbounded Knapsack
Bounded Knapsack
• 무게와 가격, 개수가 각각 𝑤𝑖, 𝑣𝑖, 𝑚𝑖인 𝑛개
의 물건이 있다. 무게의 총합이 𝑊를 초과
하지 않도록 물건을 선택했을 때, 가격 총
합의 최대값을 구하라.
• 1 ≤ 	𝑛 ≤ 	1000
• 1 ≤ 	𝑤𝑖, 𝑣𝑖 ≤ 	1000
• 1 ≤ 	𝑚𝑖 ≤ 	1000
• 1 ≤ 	𝑊 ≤ 	10000
Bounded Knapsack
• (𝑤𝑖, 𝑣𝑖, 𝑚𝑖) => 𝑚𝑖개의 (𝑤𝑖, 𝑣𝑖, 1)로 바꿈
=> 0/1 Knapsack
• 시간복잡도 O(W ∑ 𝑚𝑖)
=> TLE
Bounded Knapsack
• 𝑀𝑖	 =	2
	+ 2]
+ 2K
+	…	+ 2^
+ 	𝑟
(0 ≤ 	𝑟	 < 2^`]
)
• 𝑤𝑖, 𝑣𝑖, 𝑚𝑖
• 시간복잡도 O(nWlogm)
⇒	 𝑤𝑖 ∗ 2
, 𝑣𝑖 ∗ 2
, 1	 , … , 𝑤𝑖 ∗ 𝑟, 𝑣𝑖 ∗ 𝑟, 1
⇒	0/1 Knapsack
Bounded Knapsack
Bounded Knapsack
• 다시 dp식에 관심을
• 𝑑𝑝[𝑖][𝑗]	= 	max	( 𝑑𝑝[𝑖	– 	1][𝑗	– 	𝑘	 ∗ 	𝑤𝑖]	+
	𝑘	 ∗ 	𝑣𝑖)		(0	 <= 	𝑘	 <= 	𝑚𝑖)
• 그냥 풀면 O(𝑛𝑚𝑊)
• 마찬가지로 k가 거슬린다.
Bounded Knapsack
𝑗𝑗 − 𝑤𝑖𝑗 − 2𝑤𝑖
𝑤𝑖를 주기로 한 그룹
같은 그룹끼리만 dp값에 영향
Bounded Knapsack
• 𝑗	 = 	𝑤𝑖	 ∗ 𝑞	 + 	𝑟	(0 ≤ r < wi), 𝑖와 𝑟 고정
• 𝑑𝑝[𝑖][𝑗]
• 𝑗에 관한 식 => 𝑞 − 𝑘에 관한 식
= max 𝑑𝑝 𝑖 − 1 𝑗 − 𝑘 ∗ 𝑤𝑖 + 𝑘 ∗ 𝑣𝑖 	(0 ≤ 𝑘 ≤ 𝑚𝑖)
= max 𝑑𝑝 𝑖 − 1 𝑞 − 𝑘 ∗ 𝑤𝑖 + 𝑟 + 𝑘 ∗ 𝑣𝑖
= max 𝑑𝑝 𝑖 − 1 𝑞 − 𝑘 ∗ 𝑤𝑖 + 𝑟 − 𝑞 − 𝑘 ∗ 𝑣𝑖 + 𝑞 ∗ 𝑣𝑖
Bounded Knapsack
• 𝑞 − 𝑘 = 𝑥
• 𝑓(𝑥) = 𝑑𝑝[𝑖 − 1][𝑥 ∗ 𝑤𝑖 + 𝑟] − 𝑥 ∗ 𝑣𝑖
• 구간 [𝑞 − 𝑚𝑖, 𝑞]에서 f(x)의 최대값 찾는 문제로
생각
• RMQ를 쓰면 O(logm)이지만
• 덱(deque)을 이용하면 O(1)에 가능
𝑑𝑝 𝑖 𝑗 = max 𝑑𝑝 𝑖 − 1 𝑥 ∗ 𝑤𝑖 + 𝑟 − 𝑥 ∗ 𝑣𝑖 + 𝑞 ∗ 𝑣𝑖
	(q − mi ≤ x ≤ q)
총 시간복잡도 O(nW)
Bounded Knapsack
Knapsack 마무리
• 최대/최소 외에도 경우의 수/판정 문제 등
다양한 곳에 응용 가능
• 𝑛, 𝑤, 𝑣	등 인자의 범위에 따라 dp식을 다르
게 정의
– 𝑛이 매우 작고 𝑤, 𝑣가 매우 큰 경우 dp로 불가
=> meet in the middle
• 그 외에도 다양한 냅색 유형 / 최적화 방법
존재함
Knapsack 응용 문제들
• 앱(BOJ 7579)
• 동전1(BOJ 2293)
• 동전2(BOJ 2294)
• 국회(BOJ 1226)
• Buying Apples!(SPOJ ABA12C)
• Large Knapsack(SPOJ LKS)
Tree DP
Tree DP 개념
• 서브 트리에서 구한 답을 결합하여 전체
트리에서의 답을 구하는 것
• 서브 트리 = 부분 문제
Tree DP
v
w1 w2 wn. . .
dp[v]
dp[w1] dp[w2] dp[wn]
Tree DP
v1 . . .
dp[v1]
vm
dp[vm]
Root
.
.
.
.
.
.
.
.
.
dp[root]
Tree DP
v1 . . .
dp[v1][a1]
vm
dp[vm][a1]
Root
.
.
.
.
.
.
.
.
.
dp[root][a1]
Tree DP
v1 . . .
dp[v1][a1]..[an]
vm
dp[vm][a1]..[an]
Root
.
.
.
.
.
.
.
.
dp[root][a1]..[an]
Tree DP로 문제 풀기
• 적절한 DP 식을 정의한다.
• 부모 노드의 DP값과 자식 노드의 DP값 사
이의 관계를 찾는다.
• 잎 노드에서의 DP값을 정의한다.(base)
• 코딩을 한다.
Tree DP 문제 판별하기
• 트리가 주어지는(트리로 모델링 가능한)
상당수의 문제
• 일반적인 그래프에서 NP인 문제
– Ex) 최대 독립 집합
트리의 독립집합(BOJ 2213)
• 최대 독립 집합(maximum independent
set) 문제로, 일반적인 그래프에서 NP
• 그래프가 트리인 경우 DP로 다항 시간에
해결 가능
트리의 독립집합(BOJ 2213)
• dp[u][c] : u를 루트로 하는 트리에서 u를
선택할때(c = 1) 또는 선택하지 않을때(c =
0) 최대 독립 집합의 크기
• 𝑑𝑝 𝑢 1 = ∑ 𝑑𝑝 𝑣 0
• 𝑑𝑝[𝑢][0] = ∑ max 𝑑𝑝 𝑣 0 , 𝑑𝑝 𝑣 1
(v는 c의 자식 노드)
• 𝑑𝑝[𝑙𝑒𝑎𝑓][0]	= 	0, 𝑑𝑝[𝑙𝑒𝑎𝑓][1]	= 	1
감시 카메라 설치(AOJ GALLERY)
• 종만북 문제
• 최소 지배 집합(minimum dominating set)
문제와 동치, 마찬가지로 일반적인 그래프
에서 NP
• 트리에서 다항 시간에 풀림
• 특별한 DP 테크닉이 요구되는 것은 아님
그 외 Tree DP 문제들
• 사회망 서비스(BOJ 2533)
– 감시 카메라 설치 문제와 비슷
• 트리 자르기(BOJ 2337)
• 나무수송(BOJ 1805)
• 트리 분할(BOJ 2454)
• 트리분할(BOJ 2584)
• 트리의 가중치(BOJ 1289)
• 트리 색칠하기(BOJ 1693)
• Karen and Supermarket(CF 815C)
• An overnight dance in discotheque(CF 814D)
Reference
• 알고리즘 문제 해결 전략
• 프로그래밍 콘테스트 챌린징
• http://codedoc.tistory.com/18
감사합니다!

More Related Content

What's hot

16.mysql stored procedures in laravel
16.mysql stored procedures in laravel16.mysql stored procedures in laravel
16.mysql stored procedures in laravelRazvan Raducanu, PhD
 
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육Ji-Woong Choi
 
HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2
HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2
HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2José Francisco Gómez Díez
 
So we're running Apache ZooKeeper. Now What? By Camille Fournier
So we're running Apache ZooKeeper. Now What? By Camille Fournier So we're running Apache ZooKeeper. Now What? By Camille Fournier
So we're running Apache ZooKeeper. Now What? By Camille Fournier Hakka Labs
 
Lessons Learned From Running Spark On Docker
Lessons Learned From Running Spark On DockerLessons Learned From Running Spark On Docker
Lessons Learned From Running Spark On DockerSpark Summit
 
Deploying PHP Applications with Ansible
Deploying PHP Applications with AnsibleDeploying PHP Applications with Ansible
Deploying PHP Applications with AnsibleOrestes Carracedo
 
stupid-simple-kubernetes-final.pdf
stupid-simple-kubernetes-final.pdfstupid-simple-kubernetes-final.pdf
stupid-simple-kubernetes-final.pdfDaniloQueirozMota
 
Open jdk8 openj9-with_icedtea-web
Open jdk8 openj9-with_icedtea-webOpen jdk8 openj9-with_icedtea-web
Open jdk8 openj9-with_icedtea-webNasser Ebrahim
 
Primeiros passos com a API do Zabbix
Primeiros passos com a API do ZabbixPrimeiros passos com a API do Zabbix
Primeiros passos com a API do ZabbixJanssen Lima
 
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...Citus Data
 
Kubernetes #6 advanced scheduling
Kubernetes #6   advanced schedulingKubernetes #6   advanced scheduling
Kubernetes #6 advanced schedulingTerry Cho
 
Continuous Testing with Molecule, Ansible, and GitHub Actions
Continuous Testing with Molecule, Ansible, and GitHub ActionsContinuous Testing with Molecule, Ansible, and GitHub Actions
Continuous Testing with Molecule, Ansible, and GitHub ActionsJeff Geerling
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slidesDocker, Inc.
 
Let's Try Every CRI Runtime Available for Kubernetes
Let's Try Every CRI Runtime Available for KubernetesLet's Try Every CRI Runtime Available for Kubernetes
Let's Try Every CRI Runtime Available for KubernetesPhil Estes
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansibleOmid Vahdaty
 

What's hot (20)

16.mysql stored procedures in laravel
16.mysql stored procedures in laravel16.mysql stored procedures in laravel
16.mysql stored procedures in laravel
 
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
 
HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2
HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2
HOWTO - Upgrade de la Infraestuctura Grid de Oracle11gR2 a Oracle12cR2
 
So we're running Apache ZooKeeper. Now What? By Camille Fournier
So we're running Apache ZooKeeper. Now What? By Camille Fournier So we're running Apache ZooKeeper. Now What? By Camille Fournier
So we're running Apache ZooKeeper. Now What? By Camille Fournier
 
Lessons Learned From Running Spark On Docker
Lessons Learned From Running Spark On DockerLessons Learned From Running Spark On Docker
Lessons Learned From Running Spark On Docker
 
Deploying PHP Applications with Ansible
Deploying PHP Applications with AnsibleDeploying PHP Applications with Ansible
Deploying PHP Applications with Ansible
 
stupid-simple-kubernetes-final.pdf
stupid-simple-kubernetes-final.pdfstupid-simple-kubernetes-final.pdf
stupid-simple-kubernetes-final.pdf
 
Open jdk8 openj9-with_icedtea-web
Open jdk8 openj9-with_icedtea-webOpen jdk8 openj9-with_icedtea-web
Open jdk8 openj9-with_icedtea-web
 
MongoDB and hadoop
MongoDB and hadoopMongoDB and hadoop
MongoDB and hadoop
 
Primeiros passos com a API do Zabbix
Primeiros passos com a API do ZabbixPrimeiros passos com a API do Zabbix
Primeiros passos com a API do Zabbix
 
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
 
Kubernetes #6 advanced scheduling
Kubernetes #6   advanced schedulingKubernetes #6   advanced scheduling
Kubernetes #6 advanced scheduling
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
Continuous Testing with Molecule, Ansible, and GitHub Actions
Continuous Testing with Molecule, Ansible, and GitHub ActionsContinuous Testing with Molecule, Ansible, and GitHub Actions
Continuous Testing with Molecule, Ansible, and GitHub Actions
 
Ansible - Hands on Training
Ansible - Hands on TrainingAnsible - Hands on Training
Ansible - Hands on Training
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slides
 
Let's Try Every CRI Runtime Available for Kubernetes
Let's Try Every CRI Runtime Available for KubernetesLet's Try Every CRI Runtime Available for Kubernetes
Let's Try Every CRI Runtime Available for Kubernetes
 
Jenkins-CI
Jenkins-CIJenkins-CI
Jenkins-CI
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansible
 
Spring Cloud Config
Spring Cloud ConfigSpring Cloud Config
Spring Cloud Config
 

More from HYUNJEONG KIM

알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)
알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)
알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)HYUNJEONG KIM
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)HYUNJEONG KIM
 
shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이HYUNJEONG KIM
 
shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이HYUNJEONG KIM
 
shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이HYUNJEONG KIM
 

More from HYUNJEONG KIM (9)

알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
 
알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)알고리즘 연합캠프 세미나 2-C (Segment Tree)
알고리즘 연합캠프 세미나 2-C (Segment Tree)
 
알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)
알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)
알고리즘 연합캠프 세미나 1-A (Multi Dimension Segment/Fenwick Tree)
 
알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)알고리즘 연합캠프 세미나 1-B (Bitwise DP)
알고리즘 연합캠프 세미나 1-B (Bitwise DP)
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
 
shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이shake! 2017 본선문제 풀이
shake! 2017 본선문제 풀이
 
shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이shake! 2017 예선 문제 풀이
shake! 2017 예선 문제 풀이
 
shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이shake! 2016 예선 문제 풀이
shake! 2016 예선 문제 풀이
 

알고리즘 연합캠프 세미나 1-D (Knapsack, Tree DP)

  • 5. Knapsack Problem의 종류 • Fractional Knapsack – 물건을 쪼갤 수 있다 • 0/1 Knapsack – 물건을 쪼갤 수 없다 – Unbounded Knapsack (물건의 개수가 무한) – Bounded Knapsack (물건의 개수가 유한)
  • 6. Fractional Knapsack • 부피가 𝑣𝑖이고, 단위 부피당 𝑐𝑖의 맛을 내 는 𝑛개의 빵이 있다. 부피가 𝑉인 가방에 최 대한 맛있는 빵을 담고 싶다. 빵을 자를 수 있다고 할 때, 맛의 합의 최대값은?
  • 7. Fractional Knapsack • Greedy 해법 – 𝑐𝑖 / 𝑣𝑖가 큰 빵부터 가방에 집어넣는다. – 𝑉를 초과하면 잘라서 집어넣는다. • 시간복잡도 O(𝑛𝑙𝑜𝑔𝑛)
  • 9. 0/1 Knapsack • DP 풀이 – 𝑑𝑝[𝑖][𝑗] : 1 ~ i번 물건을 고려하여 크기의 합이 j가 되도 록 선택했을 때 가치의 최대값 – 𝑑𝑝[0][0] = 0, 𝑑𝑝[0][𝑖] = −∞ ( 0 < 𝑖 <= 𝑛 ) – 𝑑𝑝[𝑖][𝑗] = 9 𝑑𝑝[𝑖 – 1][𝑗] ( 𝑗 < 𝑠 𝑖 ) max ( 𝑑𝑝[𝑖 – 1][𝑗], 𝑑𝑝[𝑖 – 1][𝑗 – 𝑠[𝑖]] + 𝑣[𝑖]) ( 𝑗 >= 𝑠[𝑖] ) 시간복잡도 : O(𝑛𝑆) 공간복잡도 : O(𝑛𝑆)
  • 11. 0/1 Knapsack • 슬라이딩 윈도(Sliding window) 기법 – 행 또는 열을 swapping하여 공간복잡도를 줄 이는 방법 – 𝑛𝑆 => 2𝑆로 최적화 가능
  • 12. 0/1 Knapsack ii - 1 𝑑𝑝[𝑖][𝑗]𝑑𝑝[𝑖 – 1][𝑗] 𝑑𝑝[𝑖 – 1][𝑗 – 𝑠𝑖]
  • 13. 0/1 Knapsack • 현재 행 => 𝑖 % 2, 이전 행 => 1 – 𝑖 % 2
  • 14. 0/1 Knapsack • 2𝑆 => 𝑆로 최적화 가능! ii - 1 j ii - 1 j j 진행 방향
  • 16. 0/1 Knapsack • 크기가 각각 1, 2, … , 𝑆이면서 가치가 0인 𝑆 개의 물건이 존재한다고 가정
  • 17. Unbounded Knapsack • 무게와 가격이 각각 𝑤𝑖와 𝑣𝑖인 𝑛개의 물건 이 있다. 무게의 총합이 𝑊를 초과하지 않 도록 물건을 선택했을 때, 가격 총합의 최 대값을 구하라. (단, 같은 종류의 물건을 몇 개라도 고르는 것이 가능하다) • 1 <= 𝑛 <= 1000 • 1 <= 𝑤𝑖, 𝑣𝑖 <= 1000 • 1 <= 𝑊 <= 10000
  • 18. Unbounded Knapsack • 𝑑𝑝[𝑖][𝑗] : 1 ~ 𝑖번 물건을 고려하여 무게 합이 𝑗가 되도록 선택했을 때 최대 가격 • 𝑑𝑝[0][0] = 0, 𝑑𝑝[0][𝑖] = −∞ (0 < 𝑖 <= 𝑛) • 𝑑𝑝[𝑖][𝑗] = max ( 𝑑𝑝[𝑖 – 1][𝑗 – 𝑘 ∗ 𝑠𝑖] + 𝑘 ∗ 𝑣𝑖) (𝑘 >= 0) 시간복잡도 O(𝑛𝑊K ) 𝐾를 없앨 수는 없을까?
  • 19. Unbounded Knapsack • 𝑑𝑝[𝑖][𝑗] = max 𝑑𝑝 𝑖 – 1 𝑗 – 𝑘 ∗ 𝑠𝑖 + 𝑘 ∗ 𝑣𝑖 (𝑘 ≥ 0) = max( 𝑑𝑝 𝑖 – 1 𝑗 , max( 𝑑𝑝 𝑖 – 1 𝑗 – 𝑘 ∗ 𝑠𝑖 + 𝑘 ∗ 𝑣𝑖)) (𝑘 ≥ 1) = max( 𝑑𝑝 𝑖 – 1 𝑗 , max( 𝒅𝒑 𝒊 – 𝟏 𝒋 – 𝒔𝒊 – 𝒌 ∗ 𝒔𝒊 + 𝒌 ∗ 𝒗𝒊) + 𝑣𝑖) (𝑘 ≥ 0) = max ( 𝑑𝑝[𝑖 – 1][𝑗], 𝑑𝑝[𝑖][𝑗 – 𝑠𝑖] + 𝑣𝑖)
  • 20. Unbounded Knapsack • 𝑑𝑝[𝑖 – 1][𝑗 – 𝑠𝑖] => 𝑑𝑝[𝑖][𝑗 – 𝑠𝑖]
  • 23. Bounded Knapsack • 무게와 가격, 개수가 각각 𝑤𝑖, 𝑣𝑖, 𝑚𝑖인 𝑛개 의 물건이 있다. 무게의 총합이 𝑊를 초과 하지 않도록 물건을 선택했을 때, 가격 총 합의 최대값을 구하라. • 1 ≤ 𝑛 ≤ 1000 • 1 ≤ 𝑤𝑖, 𝑣𝑖 ≤ 1000 • 1 ≤ 𝑚𝑖 ≤ 1000 • 1 ≤ 𝑊 ≤ 10000
  • 24. Bounded Knapsack • (𝑤𝑖, 𝑣𝑖, 𝑚𝑖) => 𝑚𝑖개의 (𝑤𝑖, 𝑣𝑖, 1)로 바꿈 => 0/1 Knapsack • 시간복잡도 O(W ∑ 𝑚𝑖) => TLE
  • 25. Bounded Knapsack • 𝑀𝑖 = 2 + 2] + 2K + … + 2^ + 𝑟 (0 ≤ 𝑟 < 2^`] ) • 𝑤𝑖, 𝑣𝑖, 𝑚𝑖 • 시간복잡도 O(nWlogm) ⇒ 𝑤𝑖 ∗ 2 , 𝑣𝑖 ∗ 2 , 1 , … , 𝑤𝑖 ∗ 𝑟, 𝑣𝑖 ∗ 𝑟, 1 ⇒ 0/1 Knapsack
  • 27. Bounded Knapsack • 다시 dp식에 관심을 • 𝑑𝑝[𝑖][𝑗] = max ( 𝑑𝑝[𝑖 – 1][𝑗 – 𝑘 ∗ 𝑤𝑖] + 𝑘 ∗ 𝑣𝑖) (0 <= 𝑘 <= 𝑚𝑖) • 그냥 풀면 O(𝑛𝑚𝑊) • 마찬가지로 k가 거슬린다.
  • 28. Bounded Knapsack 𝑗𝑗 − 𝑤𝑖𝑗 − 2𝑤𝑖 𝑤𝑖를 주기로 한 그룹 같은 그룹끼리만 dp값에 영향
  • 29. Bounded Knapsack • 𝑗 = 𝑤𝑖 ∗ 𝑞 + 𝑟 (0 ≤ r < wi), 𝑖와 𝑟 고정 • 𝑑𝑝[𝑖][𝑗] • 𝑗에 관한 식 => 𝑞 − 𝑘에 관한 식 = max 𝑑𝑝 𝑖 − 1 𝑗 − 𝑘 ∗ 𝑤𝑖 + 𝑘 ∗ 𝑣𝑖 (0 ≤ 𝑘 ≤ 𝑚𝑖) = max 𝑑𝑝 𝑖 − 1 𝑞 − 𝑘 ∗ 𝑤𝑖 + 𝑟 + 𝑘 ∗ 𝑣𝑖 = max 𝑑𝑝 𝑖 − 1 𝑞 − 𝑘 ∗ 𝑤𝑖 + 𝑟 − 𝑞 − 𝑘 ∗ 𝑣𝑖 + 𝑞 ∗ 𝑣𝑖
  • 30. Bounded Knapsack • 𝑞 − 𝑘 = 𝑥 • 𝑓(𝑥) = 𝑑𝑝[𝑖 − 1][𝑥 ∗ 𝑤𝑖 + 𝑟] − 𝑥 ∗ 𝑣𝑖 • 구간 [𝑞 − 𝑚𝑖, 𝑞]에서 f(x)의 최대값 찾는 문제로 생각 • RMQ를 쓰면 O(logm)이지만 • 덱(deque)을 이용하면 O(1)에 가능 𝑑𝑝 𝑖 𝑗 = max 𝑑𝑝 𝑖 − 1 𝑥 ∗ 𝑤𝑖 + 𝑟 − 𝑥 ∗ 𝑣𝑖 + 𝑞 ∗ 𝑣𝑖 (q − mi ≤ x ≤ q) 총 시간복잡도 O(nW)
  • 32. Knapsack 마무리 • 최대/최소 외에도 경우의 수/판정 문제 등 다양한 곳에 응용 가능 • 𝑛, 𝑤, 𝑣 등 인자의 범위에 따라 dp식을 다르 게 정의 – 𝑛이 매우 작고 𝑤, 𝑣가 매우 큰 경우 dp로 불가 => meet in the middle • 그 외에도 다양한 냅색 유형 / 최적화 방법 존재함
  • 33. Knapsack 응용 문제들 • 앱(BOJ 7579) • 동전1(BOJ 2293) • 동전2(BOJ 2294) • 국회(BOJ 1226) • Buying Apples!(SPOJ ABA12C) • Large Knapsack(SPOJ LKS)
  • 35. Tree DP 개념 • 서브 트리에서 구한 답을 결합하여 전체 트리에서의 답을 구하는 것 • 서브 트리 = 부분 문제
  • 36. Tree DP v w1 w2 wn. . . dp[v] dp[w1] dp[w2] dp[wn]
  • 37. Tree DP v1 . . . dp[v1] vm dp[vm] Root . . . . . . . . . dp[root]
  • 38. Tree DP v1 . . . dp[v1][a1] vm dp[vm][a1] Root . . . . . . . . . dp[root][a1]
  • 39. Tree DP v1 . . . dp[v1][a1]..[an] vm dp[vm][a1]..[an] Root . . . . . . . . dp[root][a1]..[an]
  • 40. Tree DP로 문제 풀기 • 적절한 DP 식을 정의한다. • 부모 노드의 DP값과 자식 노드의 DP값 사 이의 관계를 찾는다. • 잎 노드에서의 DP값을 정의한다.(base) • 코딩을 한다.
  • 41. Tree DP 문제 판별하기 • 트리가 주어지는(트리로 모델링 가능한) 상당수의 문제 • 일반적인 그래프에서 NP인 문제 – Ex) 최대 독립 집합
  • 42. 트리의 독립집합(BOJ 2213) • 최대 독립 집합(maximum independent set) 문제로, 일반적인 그래프에서 NP • 그래프가 트리인 경우 DP로 다항 시간에 해결 가능
  • 43. 트리의 독립집합(BOJ 2213) • dp[u][c] : u를 루트로 하는 트리에서 u를 선택할때(c = 1) 또는 선택하지 않을때(c = 0) 최대 독립 집합의 크기 • 𝑑𝑝 𝑢 1 = ∑ 𝑑𝑝 𝑣 0 • 𝑑𝑝[𝑢][0] = ∑ max 𝑑𝑝 𝑣 0 , 𝑑𝑝 𝑣 1 (v는 c의 자식 노드) • 𝑑𝑝[𝑙𝑒𝑎𝑓][0] = 0, 𝑑𝑝[𝑙𝑒𝑎𝑓][1] = 1
  • 44. 감시 카메라 설치(AOJ GALLERY) • 종만북 문제 • 최소 지배 집합(minimum dominating set) 문제와 동치, 마찬가지로 일반적인 그래프 에서 NP • 트리에서 다항 시간에 풀림 • 특별한 DP 테크닉이 요구되는 것은 아님
  • 45. 그 외 Tree DP 문제들 • 사회망 서비스(BOJ 2533) – 감시 카메라 설치 문제와 비슷 • 트리 자르기(BOJ 2337) • 나무수송(BOJ 1805) • 트리 분할(BOJ 2454) • 트리분할(BOJ 2584) • 트리의 가중치(BOJ 1289) • 트리 색칠하기(BOJ 1693) • Karen and Supermarket(CF 815C) • An overnight dance in discotheque(CF 814D)
  • 46. Reference • 알고리즘 문제 해결 전략 • 프로그래밍 콘테스트 챌린징 • http://codedoc.tistory.com/18