시작 하기에 앞서서
C언어 모르시는 분?
컴퓨터에 C언어/C++ IDE를 켜 주세요
Visual Studio, CLion, Codeblock 등
실습을 하기 위함입니다.
문제는 http://acmicpc.net/, http://dovelet.com/ 에서 가져왔습니다.
Memoization(메모이제이션)
동일한 계산을반복해야 할 때, 이전에 계산한 값을 메모리에 저장
함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도
를 빠르게 하는 기술
Dynamic Programming의 핵심이 되는 기술
Memoization을 이용한 Fibonacci
구간 합 구하기
3080 50 90 70 100 10 20 40 60
I J
임의의 I번째 수부터 J번째 수까지의 구간의 합
14.
구간 합 구하기
일반적인 방법(for문 이용)
매번 이렇게 계산을 해야 함..
시간 복잡도 : O(n)
15.
구간 합 구하기
구간 합에서 Memoization을 하려면 어떻게 해야 할까요?
첫번째 수 부터 자신 까지의 누적 합을 저장
(I번째 수~J번째 수의 누적 합) = Data[J] - Data[I-1]
시간 복잡도 : O(1)
입력 30 80 50 90 70 100 10 20 40 60
누계 30 110 160 250 320 420 430 450 490 550
I J
배낭 채우기 문제
Knapsack Problem 이라고도 함.
무게 W와 가치 V가 주어질 때, 가치가 최대가 되게끔..
𝑚𝑎𝑥:
𝑖=1
𝑁
𝑣𝑖 ∙ 𝑥𝑖
subject to
𝑖=1
𝑁
𝑤𝑖 ∙ 𝑥𝑖 ≤ 𝐶
𝑥𝑖 ∈ 0,1 , 𝑖 ∈ 1, ⋯ , 𝑁
and 𝑥𝑖 is decision variable which defines the selection of 𝐼𝑖