본문 바로가기
Algorithm/이론

DP(다이나믹 프로그래밍)

by Salgoo26 2021. 9. 7.

Dynamic Programming

- 그리디 알고리즘과 같이, 최적화 문제를 해결하는 알고리즘이다.

- 문제를 부분 문제로 분할한 후 가장 작은 부분 문제부터 해를 구하여 결과를 테이블에 저장하고, 테이블에 저장된 부분 문제의 해를 이용하여 상위 문제의 해를 구하는 알고리즘이다.

 

다음은 피보나치 함수를 DP로 구현한 예시이다.

# 기록할 배열의 크기를 먼저 정해놓는 경우
def fibo1(n):
    arr = [0] * (n+1)
    arr[1] = 1      # 최초의 부분문제의 해를 배열에 기록

    for i in range(2, n+1):
        arr[i] = arr[i-1] + arr[i-2]    # 각 부분문제의 해를 구하여 저장

    return arr[n]
    
    
# 배열의 크기를 미리 정하지 않고 해결하는 경우
def fibo2(n):
    arr = [0, 1]

    for i in range(2, n + 1):
        arr.append(arr[i-1] + arr[i-2])

    return arr[n]

 

 

팩토리얼도 DP로 구현 가능하다.

def factorial(n):
    arr = [1]

    for i in range(1, n + 1):
        arr.append(i*arr[i-1])

    return arr[n]
    
    

# 배열 크기를 미리 지정
def fact(n):
	table = [0] * (n+1)
    table[0] = 1
    
    for i in range(1, n+1):
        table[i] = i * table[i-1]

    return table[n]

 

 

- 위와 같은 문제를 DP로 해결하는 것은, memoization이나 단순 재귀로 문제를 해결하는 것보다 성능 면에서 효율적이라고 볼 수 있다. (재귀가 갖고있는 오버헤드의 문제점으로 인해)

'Algorithm > 이론' 카테고리의 다른 글

비트연산 활용  (0) 2021.09.29
최대공약수 구하기 - 유클리드 호제법  (0) 2021.09.21
검색 알고리즘  (0) 2021.08.23
부분집합을 구하는 알고리즘 - bit 연산 활용  (0) 2021.08.22
2차원 배열 탐색  (0) 2021.08.22

댓글