VioletaBabel

재귀와 동적 프로그래밍 본문

백준/백준-C++
재귀와 동적 프로그래밍
Beabletoet 2017. 9. 13. 22:59

재귀로 풀기 적당한 문제

'n번째 ~를 계산하는 알고리즘'

'첫 n개를 나열하는 코드'

'모든 ~를 계산하는 메소드'


--

접근법


1. 상향식 접근법

가장 간단한 경우에 대한 풀이법보터 발견한 후 점진적으로 늘려간다.


2. 하향식 접근법

문제들을 어떻게 하면 부분적으로 나눌 수 있는지 생각해본다.

나뉜 부분문제들이 서로 겹치지 않도록 주의한다.


3. 반반 접근법

절반씩 재귀적으로 탐색해나가는 방법

ex) 병합 정렬



--

재귀적 해법 vs 순환적 해법

재귀적 알고리즘은 공간 효율성에 좋지 않다.

허나 순환적으로 구현된 코드가 더 복잡할 때가 많다.



--

동적 계획법

재귀적 알고리즘과 반복적으로 호출되는 부분 문제를 찾는 것이 관건.

상향식 접근을 동적 프로그래밍, 하향식 접근을 메모이제이션이라고 함.



--

피보나치 수 구하기


1. 하향식 동적 프로그래밍(메모이제이션)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<cstdio>
int fib(int i);
int num[46];
int main()
{
    printf("46번째 피보나치 수는 %d이다.", fib(45));
}
int fib(int i)
{
    if (i == 0 || i == 1)
        return 1;
    if (num[i] == 0)
        num[i] = fib(i - 1+ fib(i - 2);
    return num[i];
}
cs


2. 상향식 동적 프로그래밍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<cstdio>
int fib(int i);
int num[46];
int main()
{
    printf("46번째 피보나치 수는 %d이다.", fib(45));
}
int fib(int i)
{
    num[0= num[1= 1;
    for (int j = 2; j <= i; ++j)
        num[j] = num[j - 1+ num[j - 2];
    return num[i];
}
cs


'백준 > 백준-C++' 카테고리의 다른 글

1652번: 누울 자리를 찾아라  (0) 2017.09.15
13458번: 시험 감독  (0) 2017.09.15
1149번: RGB거리  (0) 2017.09.13
수학 및 논리 퍼즐  (0) 2017.09.13
9461번: 파도반 수열  (0) 2017.09.08
Comments