Microsoft PowerPoint - slide03.pptx

Similar documents
chap x: G입력

< B5BFBEC6BDC3BEC6BBE E687770>

C프로-3장c03逞풚

?

며 오스본을 중심으로 한 작은 정부, 시장 개혁정책을 밀고 나갔다. 이에 대응 하여 노동당은 보수당과 극명히 반대되는 정강 정책을 내세웠다. 영국의 정치 상황은 새누리당과 더불어 민주당, 국민의당이 서로 경제 민주화 와 무차별적 복지공약을 앞세우며 표를 구걸하기 위한

3232 편집본(5.15).hwp

1) 음운 체계상의 특징 음운이란 언어를 구조적으로 분석할 때, 가장 작은 언어 단위이다. 즉 의미분화 를 가져오는 최소의 단위인데, 일반적으로 자음, 모음, 반모음 등의 분절음과 음장 (소리의 길이), 성조(소리의 높낮이) 등의 비분절음들이 있다. 금산방언에서는 중앙

K&R2 Reference Manual 번역본

HW5 Exercise 1 (60pts) M interpreter with a simple type system M. M. M.., M (simple type system). M, M. M., M.

0429bodo.hwp

伐)이라고 하였는데, 라자(羅字)는 나자(那字)로 쓰기도 하고 야자(耶字)로 쓰기도 한다. 또 서벌(徐伐)이라고도 한다. 세속에서 경자(京字)를 새겨 서벌(徐伐)이라고 한다. 이 때문에 또 사라(斯羅)라고 하기도 하고, 또 사로(斯盧)라고 하기도 한다. 재위 기간은 6

時 習 說 ) 5), 원호설( 元 昊 說 ) 6) 등이 있다. 7) 이 가운데 임제설에 동의하는바, 상세한 논의는 황패강의 논의로 미루나 그의 논의에 논거로서 빠져 있는 부분을 보강하여 임제설에 대한 변증( 辨 證 )을 덧붙이고자 한다. 우선, 다음의 인용문을 보도록

최우석.hwp

cls46-06(심우영).hwp

교사용지도서_쓰기.hwp

E1-정답및풀이(1~24)ok

< BDC3BAB8C1A4B1D4C6C75BC8A3BFDC D2E687770>

<C1B6BCB1B4EBBCBCBDC3B1E2342DC3D6C1BE2E687770>


<C0CEBCE2BABB2D33C2F7BCF6C1A420B1B9BFAAC3D1BCAD203130B1C72E687770>

untitled

민주장정-노동운동(분권).indd

과 위 가 오는 경우에는 앞말 받침을 대표음으로 바꾼 [다가페]와 [흐귀 에]가 올바른 발음이 [안자서], [할튼], [업쓰므로], [절믐] 풀이 자음으로 끝나는 말인 앉- 과 핥-, 없-, 젊- 에 각각 모음으로 시작하는 형식형태소인 -아서, -은, -으므로, -음

6±Ç¸ñÂ÷

<C3D6C1BE5FBBF5B1B9BEEEBBFDC8B0B0DCBFEFC8A C3D6C1BEBABB292E687770>

초등국어에서 관용표현 지도 방안 연구

177

제주어 교육자료(중등)-작업.hwp

¸é¸ñ¼Ò½ÄÁö 63È£_³»Áö ÃÖÁ¾

01Report_210-4.hwp

<C3D1BCB15FC0CCC8C45FBFECB8AE5FB1B3C0B0C0C75FB9E6C7E D352D32315FC5E4292E687770>



교육 과 학기 술부 고 시 제 호 초 중등교육법 제23조 제2항에 의거하여 초 중등학교 교육과정을 다음과 같이 고시합니다. 2011년 8월 9일 교육과학기술부장관 1. 초 중등학교 교육과정 총론은 별책 1 과 같습니다. 2. 초등학교 교육과정은 별책

시험지 출제 양식

우리나라의 전통문화에는 무엇이 있는지 알아봅시다. 우리나라의 전통문화를 체험합시다. 우리나라의 전통문화를 소중히 여기는 마음을 가집시다. 5. 우리 옷 한복의 특징 자료 3 참고 남자와 여자가 입는 한복의 종류 가 달랐다는 것을 알려 준다. 85쪽 문제 8, 9 자료

상품 전단지

::: 해당사항이 없을 경우 무 표시하시기 바랍니다. 검토항목 검 토 여 부 ( 표시) 시 민 : 유 ( ) 무 시 민 참 여 고 려 사 항 이 해 당 사 자 : 유 ( ) 무 전 문 가 : 유 ( ) 무 옴 브 즈 만 : 유 ( ) 무 법 령 규 정 : 교통 환경 재

2

DBPIA-NURIMEDIA

화이련(華以戀) hwp

ÆòÈ�´©¸® 94È£ ³»Áö_ÃÖÁ¾

歯1##01.PDF

<5BC1F8C7E0C1DF2D31B1C75D2DBCF6C1A4BABB2E687770>

120229(00)(1~3).indd

2002년 2학기 자료구조

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

C++ Programming

<BFBEBEC6C0CCB5E9C0C720B3EEC0CC2E20B3EBB7A120C0CCBEDFB1E220C7D0B1B3202D20C0DAB7E1322E687770>

C 프로그래밊 개요

2015년 2월 12일 사랑의 동삭교육 제 호 (2월) 년 2월 12일 사랑의 동삭교육 제 호 (2월) 6 겨울이 되면 1-4 박지예 겨울이 되면 난 참 좋아. 겨울이 되면 귀여운 눈사람도 만들고 겨울이 되면 신나는 눈싸움도 하고 겨울이

슬라이드 1

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

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<3130BAB9BDC428BCF6C1A4292E687770>

11민락초신문4호

Microsoft PowerPoint - chap05-제어문.pptx


Ⅰ. 머리말 각종 기록에 따르면 백제의 초기 도읍은 위례성( 慰 禮 城 )이다. 위례성에 관한 기록은 삼국사기, 삼국유사, 고려사, 세종실록, 동국여지승람 등 많은 책에 실려 있는데, 대부분 조선시대에 편 찬된 것이다. 가장 오래된 사서인 삼국사기 도 백제가 멸망한지

PowerPoint Presentation

제1절 조선시대 이전의 교육

사진 24 _ 종루지 전경(서북에서) 사진 25 _ 종루지 남측기단(동에서) 사진 26 _ 종루지 북측기단(서에서) 사진 27 _ 종루지 1차 건물지 초석 적심석 사진 28 _ 종루지 중심 방형적심 유 사진 29 _ 종루지 동측 계단석 <경루지> 위 치 탑지의 남북중심

새만금세미나-1101-이양재.hwp

??

슬라이드 1

652

WS12. Security

歯 조선일보.PDF

<33B1C7C3D6C1BEBABB28BCF6C1A42D E687770>

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

<C1DFB1DE2842C7FC292E687770>

96부산연주문화\(김창욱\)

???? 1

PowerPoint 프레젠테이션

목 차 국회 1 월 중 제 개정 법령 대통령령 7 건 ( 제정 -, 개정 7, 폐지 -) 1. 댐건설 및 주변지역지원 등에 관한 법률 시행령 일부개정 1 2. 지방공무원 수당 등에 관한 규정 일부개정 1 3. 경력단절여성등의 경제활동 촉진법 시행령 일부개정 2 4. 대

종사연구자료-이야기방 hwp

정 답 과 해 설 1 (1) 존중하고 배려하는 언어생활 주요 지문 한 번 더 본문 10~12쪽 [예시 답] 상대에게 상처를 주고 한 사 람의 삶을 파괴할 수도 있으며, 사회 전체의 분위기를 해쳐 여러 가지 사회 문제를 발생시킬 수 있다. 04 5

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

<34B1C720C0CEB1C7C4A7C7D828C3D6C1BEC6EDC1FD D28BCF6C1A4292E687770>

160215

참고 금융분야 개인정보보호 가이드라인 1. 개인정보보호 관계 법령 개인정보 보호법 시행령 신용정보의 이용 및 보호에 관한 법률 시행령 금융실명거래 및 비밀보장에 관한 법률 시행령 전자금융거래법 시행령 은행법 시행령 보험업법 시행령 자동차손해배상 보장법 시행령 자본시장과

보광31호(4)

hwp

전기설비의 검사˚점검 및 시험등

580 인물 강순( 康 純 1390(공양왕 2) 1468(예종 즉위년 ) 조선 초기의 명장.본관은 신천( 信 川 ).자는 태초( 太 初 ).시호는 장민( 莊 愍 ).보령현 지내리( 保 寧 縣 池 內 里,지금의 보령시 주포면 보령리)에서 출생하였다.아버지는 통훈대부 판무

<33C6E4C0CCC1F620C1A63139C8A320B8F1C2F72E687770>

<C1DFB0B3BBE7B9FD3128B9FDB7C92C20B0B3C1A4B9DDBFB5292E687770>

ad hwp

3. 은하 1 우리 은하 위 : 나선형 옆 : 볼록한 원반형 태양은 은하핵으로부터 3만광년 떨어진 곳에 위치 2 은하의 분류 규칙적인 모양의 유무 타원은하, 나선은하와 타원은하 나선팔의 유무 타원은하와 나선 은하 막대 모양 구조의 유무 정상나선은하와 막대나선은하 4.

근대문화재분과 제4차 회의록(공개)

인천광역시의회 의원 상해 등 보상금 지급에 관한 조례 일부개정조례안 의안 번호 179 제안연월일 : 제 안 자 :조례정비특별위원회위원장 제안이유 공무상재해인정기준 (총무처훈령 제153호)이 공무원연금법 시행규칙 (행정자치부령 제89호)으로 흡수 전면 개

교육실습 소감문

ePapyrus PDF Document


1

1 1 만 알아보기 1000이 10개이면 10000입니다. 이것을 또는 1만이라 쓰고 만 또는 일만이라 고 읽습니다. 9000보다 은 2 다섯 자리 수 알아보기 9900보다 보다 보다 1 큰 수입니다. ⑴ 1000

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

Transcription:

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

오늘 할 얘기 프로그래밍 대회의 꽃, 동적 계획법 다양한 패턴들 Brute-Force 알고리즘 최적화하기 최적화 문제(Optimization Problem) 풀기 경우의 수와 확률 문제 풀기 with a lot of sample problems

Wildcards Query: *pr*n* Option Volatility And Pricing Introduction to Algorithms Programmer in New York Programming Pearls Harry Potter and the Prisoner of Azkaban Harry Potter and the Sorcerer s Stone Harry Potter and the Deathly Hallows The Lord of the Rings...? 는 한 글자에, * 는0+개의 글자에 매칭될 수 있 다. 주어진 와일드카드에 매칭되는 제목의 수는? 제목과 와일드카드의 길이는200 이하

Wildcards: A Recursive Algorithm string s 와wildcard w 가 주어졌을 때, s 의n글 자와 나머지, w 의 첫 글자와 나머지로 각각 나눈 다. * pr*n* Harry Potter and the Prisoner of Azkaban

Wildcards: A Recursive Algorithm bool ismatched(string string title, string wildcard) { if(title.empty() && wildcard.empty()) return ; if(title.empty()) return ; for(int n = 0; n <= title.size(); ++n) if(matches(wildcard[0], title.substr(0, n))) if(ismatched(, )) return true; } return false; 빈칸을 채워 봅시다^_^ bool matches(char ch, string str) 이 있다고 가정하고..

Wildcards: A Recursive Algorithm bool ismatched(string string title, string wildcard) { if(title.empty() && wildcard.empty()) return true; if(title.empty()) return isallstars(wildcard); for(int n = 0; n <= title.size(); ++n) if(matches(wildcard[0], title.substr(0, n))) if(ismatched(title.substr(n), wildcard.substr(1))) return true; } return false; 빈칸을 채웠습니다^_^

Can We Brute-Force It? **************** *************z zzzzzzzzzzzzzzzz zzzzzzzzzzzzza.. 물론, ad-hoc 최적화를 할 수 있지만, 논외로 두죠

Optimizing Function Calls * * ************** **********z z zz zzzzzzzzzzzzz zzzzzzzzzza * * ************** **********z zz z zzzzzzzzzzzzz zzzzzzzzzza 빨간 경우의 답과 녹색 경우의 답은 다른가? 입력은 다른가?

같은 입력 == 같은 답 ismatched( a, z ) 는 몇 번이나 호출될까? 이거 한 번만 계산하면 안되나요?

Caching Function Values string title, wildcard; int cache[100][100]; // title.substr(t) and wildcard.substr(w) can be matched? bool ismatched(int int t, int w) { if(t == title.size() && w == wildcard.size()) return 1; if(t == title.size()) return isallstars(wildcard.substr(w)); if(cache[t][w]!= -1) return cache[t][w]; for(int n = 0; n <= title.size() - t; ++n) if(matches(wildcard[w], title.substr(t, n))) if(ismatched(t+n, w)) return cache[t][w] = 1; return cache[t][w] = 0; } cache[][] 는 모두-1 로 초기화 특정 입력에 대한 계산 값을 테이블에 저장해 둠

How Much Speedup? 최적화 이전 제목의 길이n, 와일드카드 길이m 에 대해 bino(n+m, m-1) bino(200,99) 9.05 10 58 최적화 이후 모든t, w 의 조합에 대해O(n) t, w 의 조합은O(n 2 ) 개수 있음 O(n 3 )

Memoization 재귀 호출로 문제를 푸는 과정에서, 한 번 계산한 결과 값을 두 번 계산하지 않도록 저장해 두는 기 법 (not memorization) Recurrence 만 있으면 언제든지 쓸 수 있다 Recurrence relation: 값이 자기 자신에 대해 재귀적 으로 정의되는 함수

Recurrence Factorial f ( 0) = 1, f ( n) = n f ( n 1) Fibonacci Numbers fib ( 0) = fib (1) = 1, fib ( n ) = fib ( n 1) + fib ( n 2) 머지 소트의 시간 복잡도 n T (0) = T (1) = 1, T ( n) = 2 T + 2 n 관계식과base case 로 구성됨

Solving A Recurrence 여러 경우, Recurrence 를closed form 으로 바 꿀 수도 있다. Ex) n T ( 0) = T (1) = 1, T ( n) = 2 T + n T ( n) = O( n lgn) 2 하지만 못 푸는 경우가 더 많아요 이런 경우에는 직접 각 인스턴스를 계산하는 수밖에 없죠 점화식을 어떻게 잡느냐에 따라 동적 계획법을 할 수 있느냐 없느냐가 갈리기도 합니다

동적 계획법 (Dynamic Programming) 재귀적 문제 정의+ Memoization 문제를 재귀적으로 정의한 뒤, 여러 번 계산되는 값을 저장해 두어 알고리즘의 속도를 높인다 컴퓨터 과학 사에 최악의 미스네이밍이라고 강력히 주장중 Dynamic 이란 말도 당최 왜 나왔는지 모를 뿐더러 Programming 은 프로그래밍과 관련 없습니다(동적 프로그래밍이라고 쓰지 맙시다)

동적 계획법의 사용처 처음에는 최적화 문제(optimization problem) 들을 풀기 위해 고안 하지만 완전 탐색을 최적화 한다거나 확률/경우의 수 문제를 풀 때도 유용하게 사용 문제가 재귀적으로 정의되느냐! 가 포인트~! 실제로 그렇지 않은 문제인데도 재귀적으로 바꿔버릴 수도 있다: 모델링의 힘

Best Path On A Diamond 6 1 2 6 7 4 9 4 1 7 6 7 5 9 4 4 4 3 2 1 2 3 6 1 7 맨 윗칸에서 맨 아랫칸으로 내려오는 방법 중 숫자의 합 을 최대화하는 방법은? 가운데 줄의 길이= N N <= 100

Can We Brute-Force It? 당근 안되겠죠 경로의 수를 세고 싶지만 대충 넘어갑시다 어차피 안될거 아는데. (이 슬라이드를 만들고 있는 지금은 목요일 새벽5시)

Best Path On A Diamond: Recursive Sol 6 s s s s 1 2 s s s 6 7 4 s s 9 4 1 7 s 6 7 5 9 4 4 4 3 2 s 1 2 3 s s 6 1 s s s 7 s s s s int n, dia[201][101]; int bestpath(int y, int x) { if(x == n) return s; if(y == n*2-2) return dia[y][x]; int delta = (y < n? 1 : -1); return max(bestpath(y+1, x), bestpath(y+1, x+delta)) + dia[y][x]; } cout << bestpath(0, 0) << endl; 가장 무식한 완전 탐색에서부터 시작합시다 s 는 무지 작은 수(-987654321 쯤) 이라고 둡시다

Introduce Memoization int n, dia[201][101], cache[201][101]; int bestpath(int y, int x) { if(x == n) return s; if(y == n*2-2) return dia[y][x]; int delta = (y < n? 1 : -1); if(cache[y][x]!= -1) return cache[y][x]; return cache[y][x] = max(bestpath(y+1, x), bestpath(y+1, x+delta)) + dia[y][x]; } Boom! 동적 계획법 알고리즘 탄생 C ( y, x) = max( C( y+ 1, x+ 1), C( y+ 1, x)) + dia[ y, x] 시간 복잡도는 얼마일까요?

참 쉽죠?

주의, 주의! int bestpath(int y, int x, int current_path = 0) { if(x == n) return s; if(y == n*2-2) return max(max_path, current_path + dia[y][x]); int delta = (y < n? 1 : -1); return bestpath(y+1, x, current_path + dia[y][x]) + bestpath(y+1, x+delta, current_path + dia[y][x]); } 이 알고리즘도 모든 경로를 다 보지만, 동적 계획 법으로 바꿀 수는 없어요(혹은 공간 복잡도가 무 지 커지거나) C ( y, x, cp) = max( C( y+ 1, x+, cp+ dia[ y, x]), C( y+ 1, x, cp+ dia[ y, x])) 부분 문제의 답은 이전까지의 답과 독립적이어야

그 말인즉슨.. 6 1 2 6 7 4 9 4 1 7 6 7 5 9 4 4 4 3 2 1 2 3 6 1 7 3부터 끝까지 가는 경로 중 가장 합이 큰 것은? 이러이러한 경로를 거쳐서 3 까지 왔다. 이 뒤를 잇는 경 로 중 가장 합이 큰 것은?

Quantization 8개의 색깔만으로 재현한 그림 Downsampling

Quantization 1,744,755,4,897,902,890,6,777 4,757,757,4,899,899,899,4,757 [1,1000] 구간의 정수 수열을, n종류의 숫자만 사 용하도록 다운샘플링하고 싶다. n <= 10, 수열의 길이<= 100 오차 제곱의 합을 최소화하는 방법은?

어떻게 재귀로 풀지? 망상A 1000^n 으로 모든 공역을 만든 다음 가장 가까운 수 로 매칭하자구.. 망상B 암말 안하고 있음 옆사람이(혹은 종만이가) 풀어주겠 지.. 망상C 아 배고프다

Key Observation 6 => 10 으로 바꿨는데11 => 9 로 바꾸는 건 사상 최대의 이다. 수열을 이루는 수들의 는 상관이 없다.

Key Observation 6 => 10 으로 바꿨는데11 => 9 로 바꾸는 건 사상 최대의_개삽질_ 이다. 수열을 이루는 수들의_순서_ 는 상관이 없다.

따라~서 입력에 주어지는 수들을 정렬하고 1,4,6,744,755,777,890,897,902 이들을 적절히n 묶음으로 나눈 후에, 각 묶음에 서의 오류를 최소화하면 되지 않겠느냐~ 1,4,6 744,755,777 890,897,902 5 760 896

Recurrence 1,4,6,744,755,777,890,897,902 here=3, groups=2 (, ) here 부터 끝까지의 숫자는 아직 매핑이 안됐다 만들 수 있는 묶음의 개수groups 첫 번째 묶음과 나머지로 나눈다면?

주어진 수열을 쪼개는 문제가 되는데.. int n; int sequence[100]; int quantize(int int here, int groups) { if(here == n) return 0; if(groups == 0) return INFINITE; int ret = INFINITE; for(int m = 1; here+m < n; ++m) { int cand = solve(here, here+m-1) + quantize(here+m, groups-1); ret = min(cand, ret); } return ret; } 주어진 수열을 첫 그룹과 나머지로 나눈다 here+ m< n C( here, groups) = minm= 0 [ solve( here, here+ m 1) + C( here+ m, groups 1)] Memoization 은 추가 안 할게요..

Coin Change JM나라에서는1백원짜리, 3백원짜리, 5백원짜리, 9백원짜리, 2천원짜리 동전을 쓰고 있다 (거짓말) 3600원을 거슬러 줘야 하는데, 몇 가지 방법으로 거슬러 줄 수 있을까?? 1백원짜리36개 3백원짜리12개 1백원짜리3개+ 3백원짜리11개+

An Iterative Solution int amt = 3600; int ret = 0; for(int one = 0; one*100 <= amt; ++one) for(int three = 0; one*100 + three*300 <= amt; ++three) for(int five = 0; one*100 + three*300 + five*500 <= amt; ++five) for(int nine = 0; one*100 + three*300 + five*500 + nine*900 <= amt; ++nine) for(int twenty = 0; one*100 + three*300 + five*500 + nine*900 + twenty*2000 <= amt; ++twenty) if(one*100 + three*300 + five*500 + nine*900 + twenty*2000 == amt) ++ret; 우와, 정말 무식하다

A Recursive Solution const int D = 5; const int denom[d] = { 100, 300, 500, 900, 2000 }; int wayschange(int amt, int idx) { if(amt == 0) return 1; if(idx == D) return 0; int ret = 0; for(int thiscoin = 0; thiscoin * denom[idx] <= amt; ++thiscoin) ret += wayschange(amt - thiscoin * denom[idx], idx+1); return ret; } Memoization 도입은 여전히 안 합니다 히히

The Recurrence denom = {100,300,500,900,2000} C( amt, idx) = Ways of decomposingamt into denom[ idx ~ n 1] = 1 (ifamt= 0) = amt / denom[ idx] n= 0 C( amt denom[ idx] n, idx + 1) (otherwise)

Diamonds...#.....#.######....##########...###.....#.#########...#######......#...#######......####.#......##... Diamonds 는 가로 길이n, 세로 길이n의 마름모 꼴이다. 주어진(n,m) 크기의 격자에서, 찾을 수 있는 다 이아몬드의 개수는?

Diamonds 다이아몬드 개수 세기 각 칸에 대해, 주어진 칸을 맨 아래 칸으로 하는 다이 아몬드의 개수를 세자 Key Observation 크기5인 다이아몬드는 언제나 같은 칸에서 시작하는 크기3다이아몬드를 포함한다 따라서, 각 칸을 맨 아래 칸으로 하는 다이아몬드의 최대 크기maxSize[y,x] 를 구하자...#.....#.######....##########.....#.#########....#...

Diamonds: Recurrence mxsize ( y, x) = max size of a diamond ending at ( y, x)...#......###......#####......#######......#####......###......#... 오늘의 마지막 문제니까 직접 풀어봅시다!

Key Observation 크기n인 다이아몬드는 사실n-2 인 다이아몬드3 개와2칸으로 구성할 수 있다...#...#...#...#......###...###...###...###.....#####...#####...#####...#####....#######...#######...#######...#######.....#####...#####...#####...#####......###...###...###...###......#...#...#...#... 크기가n 이려면, (y-1,x-1), (y-1,x+1), (y-2,x) 에 각각 크기n-2 인 다이아몬드가 있어야 한다

Recurrence mxsize ( y, x) = max size of a diamond ending at ( y, x) = 0 (if cell[y,x] == '.') = 1 (if cell[y,x] == '#' and cell[y-1, x] == '.') = max( mxsize( y 1, x 1), mxsize( y 1, x+ 1), mxsize( y 2, x)) + 2 (max 가0 일 경우 예외 처리가 필요합니다) Memoization 답은 간단하게 유도할 수 있다!

Recursive Dynamic Programming int n, m, cache[101][101]; char grid[101][101]; int maxsize(int int y, int x) { if(grid[y][x] ==. ) return 0; if(y < 2 x == 0 x+1 == m grid[y-1][x] ==. ) return 1; if(cache[y][x]!= -1) return cache[y][x]; int p = max(maxsize(y-2, x), mx(maxsize(y-1, x-1), maxsize(y-1, x+1))); } if(p == 0 grid[y-1][x] ==. ) return cache[y][x] = 1; return cache[y][x] = p + 2; 하지만 꼭 재귀호출을 써야 할까?

Iterative Dynamic Programming int n, m, C[101][101]; char grid[101][101]; for(int y = 0; y < n; ++y) for(int x = 0; x < m; ++x) { if(grid[y][x] ==. ) C[y][x] = 0; else if(x > 0 && x+1 < m && y >= 2 && gid[y-1][x] == # ) { int p = max(c[y-2][x], max(c[y-1][x-1], C[y-1][x+1])); if(p == 0) C[y][x] = 1; else C[y][x] = p + 2; } } mxsize() 는y 가 더 작은 칸들만을 참조한다 특정 순서로 값을 계산해도 될 경우, 꼭 재귀호출 을 쓸 필요는 없다

Memoization vs. Iterative Memoization 좀더 느리다 스택을 사용한다 연산 순서에 대해 고민 할 필요가 없다 코드가 좀더 직관적이 다 모든 부분문제를 계산 할 필요 없을 경우 더 빠 르다 Iterative 좀더 빠르다 스택을 사용X 연산 순서에 대해 고민 해야 한다 코드가 좀 더 복잡해진 다 모든 부분문제를 계산 해야 할 경우 더 빠르다

Lessons Learned 동적 계획법은 재귀적으로 정의되는 문제에는 어 디나 사용될 수 있다 완전 탐색 시간 단축 Optimization Problem 의 해결 경우의 수와 확률 문제 Recurrence (or 점화식) 문제의 답을 자신에 대해 재귀적으로 정의한다 각 입력에 대한 답을 하나의 부분문제라고 부른다

Following Next Day 좀더 복잡한 주제들 Theoretical Foundations 더 어려운 Optimization/Counting 문제들 계산 게임(Computational Games) with DP DP with Exponential State Space 최적화 문제의 답안 생성하기etc.