Microsoft PowerPoint - slide04.pptx

Similar documents
Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long Max

쉽게배우는알고리즘 8장. 동적프로그래밍 프로그래밍 Dynamic Programming (DP)

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

2002년 2학기 자료구조

OCW_C언어 기초

untitled

chap 5: Trees

중간고사

Chap 6: Graphs


PowerPoint 프레젠테이션

C 언어 프로그래밊 과제 풀이

PowerPoint 프레젠테이션

WS12. Security

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap04-연산자.pptx

PowerPoint 프레젠테이션

OR MS와 응용-03장


JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

금오공대 컴퓨터공학전공 강의자료

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

ePapyrus PDF Document

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

슬라이드 1

C프로-3장c03逞풚

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

PowerPoint 프레젠테이션

Chap 6: Graphs

C 프로그래밊 개요

Microsoft PowerPoint - slide05.pptx

chap x: G입력

public key private key Encryption Algorithm Decryption Algorithm 1

Microsoft PowerPoint - slide03.pptx

untitled

untitled

Microsoft PowerPoint - chap06-1Array.ppt

강의 개요

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap06-2pointer.ppt

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

UI TASK & KEY EVENT

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

23

Microsoft PowerPoint - Java7.pptx

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

쉽게 풀어쓴 C 프로그래밍

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Lab 3. 실습문제 (Single linked list)_해답.hwp

Chapter 4. LISTS

chap8.PDF

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

WISHBONE System-on-Chip Interconnection Architecture for Portable IP Cores

PowerPoint 프레젠테이션

- 1 -

Index

Microsoft Word - FunctionCall

C 프로그래밊 개요

chap01_time_complexity.key

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

LIDAR와 영상 Data Fusion에 의한 건물 자동추출

03장.스택.key

Microsoft PowerPoint - chap05-제어문.pptx

슬라이드 1

설계란 무엇인가?

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

PowerPoint Presentation

Microsoft PowerPoint - ch12 - Graph, Graph Algorithms

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Data Structure

ePapyrus PDF Document

Run 봄 연습 Mar 18 Mar 24, 2018, Week 3 문제 1. 초코바 입력 파일: 출력 파일: 시간 제한: 메모리 제한: standard input standard output 1 seconds 128 megabytes H W 격자 모양의 초콜릿이 있다.

Microsoft PowerPoint - [2009] 02.pptx

금오공대 컴퓨터공학전공 강의자료

2학년 1학기 1,2단원 1 차례 세 자리의 수 1-1 왜 몇 백을 배워야 하나요? 1-2 세 자리 수의 자릿값 알아보기와 크기 비교하기 1-3 뛰어 세기와 수 배열표에서 규칙 찾기 1단원 기본 평가 단원 창의 서술 논술형 평가 22 1단원 심화 수

PowerPoint Presentation

PowerPoint 프레젠테이션

와플-4년-2호-본문-15.ps

10주차.key

문제는다양한방법으로풀수있으며, 다음의풀이는여러해법중하나이다. [ 문제 1] 밀도구하기 질량밀도 이다. 물체의질량 M과부피 V가주어지면밀도는 M/V로구할수있다. 부피 여기서질량 M 과부피 V 는정수이지만 M/V 은실수가될수있기때문에 M 과 V 를받 을때실수로입력받는다.

Microsoft PowerPoint - chap10-함수의활용.pptx

서강대학교공과대학컴퓨터공학과 (1/5) CSE3081 (2 반 ): 알고리즘설계와분석 < 프로그래밍숙제 2> (v_1.0) 담당교수 : 임인성 2015 년 10 월 13 일 마감 : 10 월 31 일토요일오후 8 시정각 제출물, 제출방법, LATE 처리방법등 : 조교가

쉽게배우는알고리즘 9장. 그래프알고리즘

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - 08_Dynamic_Prog_01.pptx

쉽게 배우는 알고리즘 강의노트

2_안드로이드UI

Java ...

강의 개요

Transcription:

Im4u 봄방학캠프 DAY 4; Discrete Optimization Problems #4 Dynamic Programming (II) 구종만 jongman@gmail.com

오늘할얘기 최적화문제의답안생성하기 다른형태의동적계획법문제들 계산게임 지수크기상태공간을갖는문제들 선형변환형태의점화식을갖는문제들 이론적배경 Optimal Substructure (.. 하지만슬라이드 50 장돌파해서이건생략 )

Longest Increasing Subsequence 7 6 10 12 8 9 7 12 14 11 단조증가하는부분수열을구하고싶다 일단은해당수열의 길이 만을찾아봅시다 O( n 2 ) 의답을찾아봅시다

Think-Path 지금까지본문제와는스타일이약간달라요 ~ 답이어디서시작할지, 끝날지를모름 당장동적계획법으로찾으려면막막할수있음 늘그렇듯이 Brute-Force 에서시작해봅시다 어떤재귀호출방법을써야모든답안을다만들어볼수있을까요?

모든답안을만들어보자 두가지방법이있을듯 : try _ subsequence( last _ number, current _ index) current_index 7 6 10 12 8 9 7 12 14 11 last_number try _ subsequence( last _ number _ index) 7 6 10 12 8 9 7 12 14 11 last_number_index 어느쪽이더동적계획법에적합해보이나? 왜?

당연히두번째죠 첫번째점화식을동적계획법으로바꾸려면주어지는숫자의크기에비례하는배열이있어야하죠 다른테크닉으로이방법을사용할수도있지만여전히더느립니다. 두번째점화식은 C i =i n C = 1 i C O( n 2 ) 에구현가능 ^_^ 번째수에서시작하는 LIS 의길이 max j= i+ 1, A j > A i j + 1 답은? maxc i

구현해봅시다 int n, A[100]; int cache[100]; int go(int here) { int& ret = cache[here]; if(ret!= -1) return ret; ret = 1; for(int there = here+1; there < n; ++there) if(a[here] < A[there]) ret = max(ret, go(there) + 1); return ret; } int ret = 0; for(int i = 0; i < n; ++i) ret = max(ret, go(i)); 처음으로 C++ 의 reference variable 을쓴코드 ( 이테크닉꽤나유용합니다 )

실제해계산하기 길이를구하기는쉬웠는데, 실제수열을출력하라면어떻게해야하나? 방법 1: 길이를저장하는대신, 수열을직접저장 int n, A[100]; vector<int int> cache[100]; vector<int int> go(int here) { vector<int int>& ret = cache[here]; if(!ret.empty()) return ret; ret.push_back(a[here]); for(int there = here+1; there < n; ++there) if(a[here] < A[there]) { vector<int int>& cand = go(there); if(cand.size() + 1 > ret.size()) { ret.clear(); ret.push_back(a[here]); ret.insert( cand.begin begin(), cand.end end() ); } } return ret; }

재귀적으로해계산하기 C14 = maxci = 14 였다고하자. 이값은어떻게14 가되었을까? 14 오른쪽에 A j > A 14 이고, Cj = 14 인 j 가존재 A C 12 17 10 4...... >4.... 8 6 9 14...... 13.... 이것을찾는일을반복하자

반복적 (Iterative) 으로찾기 int n, A[100]; int cache[100]; int bestindex = 0; for(int i = 1; i < n; ++i) if(go(bestindex) < go(i)) bestindex = i; do { printf("%d ", A[bestIndex]); for(int i = bestindex+1; i < n; ++i) if(go(i) + 1 == go(bestidex) && A[bestIndex] < A[i]) { bestindex = i; break; } } while(a[bestindex] > 1); printf("\n"); 반복적으로다음위치를찾아나간다

재귀적으로찾기 int n, A[100]; int cache[100]; void printbest(int here) { printf("%d ", A[here]); if(cache[here] > 1) for(int there = here+1; there < N; ++there) if(cache[there]+1 == cache[here] && A[there] > A[here]) { printbest(there); break; } } for(int i = 1; i < n; ++i) if(go(bestindex) < go(i)) bestindex = i; printbest(bestindex); 경험적으로는재귀적으로짜는편이좀더좋다

Lexicographically Smallest Solution 주어진수열의 LIS 중, 사전순으로가장앞에있는것을계산하라 5 6 7 8 9 1 2 3 4 5

Lexicographically Smallest Solution 주어진중복이없는수열의 LIS 중, 사전순으로가장앞에있는것을계산하라 6 7 8 9 10 1 2 3 4 5 C i = maxc 인i 가하나라면문제없다. 여러개라면어떻게할까? 숫자가 ( 클 / 작을 ) 수록좋다!

Lexicographically Smallest Solution 주어진중복이없는수열의 LIS 중, 사전순으로가장앞에있는것을계산하라 6 7 8 9 10 1 2 3 4 5 C i = maxc 인i 가하나라면문제없다. 여러개라면어떻게할까? 숫자가 ( 클 / 작을 ) 수록좋다!

K-th Smallest Solution 주어진수열의 LIS 중, 사전순으로 k 번째에있는것을계산하라 K=3 1 5 2 6 3 7 4 8 5 9 답의수는감당하기힘들정도로커질수있다. 2 1 4 3 6 5 8 7 10 9 따라서, Brute-Force 로는안된다!

또한번의동적계획법 가장좋은답의 길이 말고도, 가장좋은답을만들수있는방법의수또한별도로계산해서저장 C i =i D i =i = 번째수에서시작하는 LIS 의길이 번째수에서시작하는LIS 의수 j= i+ 1, A j n 1 Σ > A, C i j + 1== C i D j 이걸가지고어떻게답을만들수있을까?

생각하기나름이겠지만 전이방법이가장쉽더군요 K 번째답 (1-based) 그앞에 k-1 개의답이있는것중사전순으로가장앞에있는답 (0-based) intskip = k 1;

그렇게생각하면 7 8 9 4 5 6 1 2 3 C i = maxc 인i 가여러개있다고합시다 이들을줄세워보면 1 에서시작하는것들이맨앞에 7 에서시작하는것들이맨뒤에 가겠지요.. 1.......... 1............. 4.......... 4............. 7.......... 7..........

첫번째숫자만맞춰봅시다 A[] D[] 7 8 9 4 5 6 1 2 3 7 12 15 If skip = 0? If skip = 20? If skip = 30? If skip = 15?

첫번째숫자만맞춰봅시다 A[] D[] 7 8 9 4 5 6 1 2 3 7 12 15 If skip = 0? 1 If skip = 20? 4 If skip = 30? 7 If skip = 15? 4

Skip=20 의예 skip=20 1.......... 1.......... 1.......... 1.......... 1............. 1.......... 1.......... 4.......... 4.......... 4............. 4.......... 4.......... 7.......... 7............ D[6]=15 new_skip=5

Skip=20 의예 skip=20 1.......... 1.......... 1.......... 1.......... 1............. 1.......... 1.......... 4.......... 4.......... 4............. 4.......... 4.......... 7.......... 7............ D[6]=15 new_skip=5

코드 int n, A[100], C[100], D[100]; void printafterskip(int begin, int skip) { printf("%d ", A[begin begin]); if(c[begin begin] == 1) return; // (A[index], index) 의쌍 vector<pair<int int, int> > nextcandidates; for(int i = begin+1; i < n; ++i) if(a[begin begin] < A[i] && C[i]+1 == C[begin begin]) nextcandidates.push_back(make_pair(a[i], i)); sort(nextcandidates.begin begin(), nextcandidates.end end()); } for(int i = 0; i < nextcandidates.size(); ++i) if(skip >= D[nextCandidates[i].second) skip -= D[nextCandidates[i].second]; else { printafterskip(nextcandidates[i].second, skip); break; }

TheDictionary 알파벳 a 와 z 만으로구성된문자열들 a 의개수는 n 개, z 의개수는 m 개라고하자. 이들을사전순으로정렬했을경우, k 번째에오는문자열은무엇일까? TopCoder SRM428 Div2 Hard

Counting 이산구조시간에배우셨겠죠? C(n,m) = ncm= 이항계수 (binomial coefficient) aazz azaz azza zaaz zaza zzaa C(n,m) = C(n-1,m-1) + C(n-1,m)

첫글자를결정해보자 C(n,m) aaaaaaazzzzzzzz aaaaaazazzzzzzz... azzzzzzzzaaaaaa zaaaaaaazzzzzzz zaaaaaazazzzzzz... zzzzzzzzaaaaaaa C(n-1,m) C(n,m-1)

배스킨라빈스 31 두명의사람이배스킨라빈스 31 을한다. 한사람은한개 ~ 여섯개의숫자를부를수있다. 한게임에서같은숫자는최대네번만부를수있다. 게임의현재진행상황이주어진다. 1123656 양쪽이 완벽하게 플레이한다고할때, 이게임의승자는?

완벽하게 의정의 상대방이어떻게플레이하더라도, 내가적절히반응하면승리할수있다 => 승리 내가어떻게플레이하더라도, 상대방이적절히반응해나를지게만들수있다 => 패배

Recurrence 게임의 상태 가주어질때, 게임의승패를결정하는함수를정의하고, 이함수를점화식으로나타낸다 F(state) = 현재상태에서, 이번차례인사람이반드시승리할수있는방법이있는가? WIN WIN LOSE? WIN? WIN? LOSE WIN LOSE LOSE

배스킨라빈스 31: 상태공간 Key Observation: 각숫자가어떤 로나왔는지는상관이없다 각숫자가나온 만이중요하다

배스킨라빈스 31: 상태공간 Key Observation: 각숫자가어떤 _ 순서 _ 로나왔는지는상관이없다 각숫자가나온 _ 횟수 _ 만이중요하다 따라서, 각숫자마다0,1,2,3,4 의상태: 5^6 = 15,625 개의상태 Quite manageable! 각상태마다할수있는행동을다해본다 어떤행동을해도내가진다면패배, 하나라도이긴다면승리

배스킨라빈스 31: 코드 map<vector<int int>, int> cache; int willwin(vector<int int>& used, int total) { if(total >= 31) return 1; if(cache.count(used)) return cache[used]; int& ret = cache[used]; for(int i = 1; i <= 6; ++i) if(used[i-1] < 4) { used[i-1]++; if(!willwin(used, total+i)) ret = 1; used[i-1]--; } return ret; } std::map 을이용한간단한 memoization!

A Game 짝수길이의게임판, 두사람의플레이어 7 8 9 4 5 6 1 2 3 5 왼쪽끝이나오른쪽끝의숫자를번갈아가며먹는다 먹은수의총합이해당플레이어의점수 ( 내점수 ) ( 상대점수 ) 를최대화할수있는방법은? IOI 96 Day 1 Task 1

A Game: 상태공간 7 8 9 4 5 6 1 2 3 5 7 8 9 4 5 6 1 2 3 5 7 8 9 4 5 6 1 2 3 5 7 8 9 4 5 6 1 2 3 5 7 8 9 4 5 6 1 2 3 5 7 8 9 4 5 6 1 2 3 5 게임의상태는왼쪽끝칸과오른쪽끝칸으로정의할수있다 : O( n 2 ) 개의상태

Minimax Algorithm f (state) = 현재상태에서첫번째플레이어의점수 두번째플레이어의점수 = f (state) 따라서, 우리점수를최대화하려면상대의점수를최소화해야한다 f ( state) = max f ( nxt) + nxt next( state) Cost( nxt)

A Game: 코드 int n, A[100]; int cache[100][100]; int go(int left, int right) { if(left > right) return 0; int& ret = c[left][right] if(ret!= -1) return ret; return ret = max( -go(left+1, right) + A[left], -go(left, right-1) + A[right] ); } go(left+1, right), go(left, right+1) 는상대방의점수

DP 가만능은아니다 Chess Endgame analysis King + Rook vs. King + Queen 어느쪽이이길것인가?

Cycles in the Game State

State Space MUST Be A DAG 게임의상태들로구성된공간에사이클이있으면 memoization 을사용할수없다 이경우에는다른방법을사용해야함 ( 생략 ) 사이클이없는그래프 (Directed Acyclic Graph)

Bit of Combinatorial Game Theory Impartial game 두플레이어가할수있는일은완전히똑같고, 현재게임판의상태에만좌우된다 체스나바둑은 Impartial Game 이아니다 Normal game 마지막으로수를둘수있는플레이어가이기는경우 Game of NIM Impartial Normal Game 은수학적으로훨씬효율적으로풀수있다 ( 여기선생략 )

Traveling Salesman Problem 모든도시를 1 번씩방문하는경로중가장짧은것은?

Can We Brute-Force It? N 개의도시에대해 N! 개의경로가있다. 20! = 2432902008176640000

Key Observation B-A-F-D, A-F-B-D 경로의차이점은? 최소한앞으로는없다!

Exponential State Space 어떤경로의현재상태를 state= {set of visited vertices, 로표현하자 current vertex} Current vertex: O(V) Set of visited vertex: O(2 V ) C( visited, here) = min C( visited { next}, next) + Cost( here, next) next visited

Implementing Set of Visited Vertices std::bitset<20> 20 개의비트 (0, 1) 을저장하는컨테이너 bitsetvariable[i] = i 번정점을방문했는가? Integers w/ Bitmasks (far more popular) 32 비트정수를사용한다 i 번비트가켜져있는가 == i 번정점을방문했는가? 9 8 7 6 5 4 3 2 1 0 372 10 = 0 1 0 1 1 1 0 1 0 0 2

C++ Bitmask Trick of Trades int bitset; // i 번째비트가켜져있다면? if(bitset & (1 << i)) // i 번째비트를켠다 bitset = (1 << i); // i 번째비트를끈다 bitset&= ~(1 << i); // i 번째비트를토글 bitset ^= (1 << i); // 모든비트를왼쪽으로한칸씩옮긴다 bitset <<= 1; & : Bitwise AND : Bitwise OR ^ : Bitwise XOR << : Shift left >> : Shift right 지수시간상태공간동적계획법은매우자주출현하는주제이므로유의합시다 ~ // 마지막비트를끈다 bitset = (bitset - 1) & bitset;

TSP: 코드 int n, graph[20][20]; int cache[20][1<<20]; int go(int here, int visited) { if(visited == (1<<n) - 1) return 0; int& ret = cache[here][visited]; if(ret!= -1) return ret; ret = 987654321; for(int next = 0; next < n; ++next next) if((visited & (1 << next)) == 0) ret = min(ret, graph[here][next next] + go(next next, visited (1 << next))); return ret; }

Game Of Euler 4x4 판에번갈아가며길이 1~3 의핀을꽂는다 위에서꽂을수도있고, 측면에서꽂을수도있다 더꽂을수없을때까지계속 마지막플레이어가진다 (misere form) 게임중간의상황이주어질때, 승자는?

Key Observation 어떤칸에핀이꽂혀있다면, 어떤형태의핀으로차있던지상관이없다 길이 3 인핀이위에서꽂혔던지 길이2인핀이옆에서꽂혔던지 길이1인핀이위에서꽂혔던지 결국 2 4 4 = 65536 개의상태가된다

The Game Of Death A 가 일곱! 을외쳤다. 술을먹을사람은?

The Game Of Death A 도꽤취했기때문에, A 가본것을믿을수는없다 왼쪽으로한명 / 오른쪽으로한명 ( 각각 1/3 확률 ) G 가술을마실확률은?

Recurrence C( i, j) = 일확률 i 개의화살표를따라간뒤에 j 번째사람 = Σ k Points( j) C( i 1, k) 3 O(NM) 동적계획법.. 32 하지만, M 2 라면어떨까?

The Recurrence Is A Linear Transform C i Ci 1(3) + Ci 1(7) + Ci 1(8) ( 0) = 3 C i Ci 1(0) + Ci 1(3) ( 1) = 3 C i Ci 1(0) + Ci 1(1) + Ci 1(5) + Ci 1(7) ( 2) = 3.. 행렬로바꿔서써보자! C = [ A] C [ ] M i i 1 C = A C M 0 우와, Fast Matrix Exponentiation 이되네요!

Lessons Learned 최적화문제의답안계산하기 K- 번째답안계산하기 계산게임 현재상태에대한 f(state) 의점화식을푼다 Minimax algorithm 상태에사이클이있는경우에는 DP 로풀수없다 Exponential State Space Bitmask trick 들을잘알면도움이된다 Problems w/ Linear Recurrence Matrix exponentiation 으로바꿔서풀수있다