파이썬/알고리즘 공부

⏭playDataAlgo 동적계획법

Jimyeung 2021. 9. 5. 22:41
728x90

동적계획법(Dynamic Programming)


💢동적계획법이란??

  • 하나의 큰 문제를 여러 개의 공통되는 작은 문제로 나누어서 작은 문제의 정답들을 결합하여 알고리즘을 푸는 과정(규칙을 찾아가는 과정)

점화식

<위>

위 그림과 같이 수열에서 n번째 항을 이전에 나온 항들로 나타낸 공식

아래 예시로 여러가지 점화식 구현도 가능하다.

✅ex1)

✅ex2)


동적계획법 접근방법

동적계획법에는 작은 것부터 구현하여 결합식히는 형식의 Bottom up과 큰것들을 쪼개는 형식의 Top Down방식으로 구현한다.


동적계획법 활용

✅Bottom up

        for i in range(2, n+1):
            fibList.aoppend(fibList[i-2] + fibList[i-1])    
            return fibList[-1]

✅Top Down

        if n ==0 or n ==1:
            return 1 
        else: 
            return (fib(n-1) + fib(n-2))

위에 사진을 보면 알 수 있듯이 Top down은 많은양의 계산이 필요하고 계산 중복, 이를 해결하기 위한 것이 메모이제이션이다.


메모이제이션

중복을 최소화하기 위해 배열 혹은 해시를 활용하는 것이 핵심

memo = {0:1, 1:1}

def fib(n):
    if n in memo:
        return memo[n] #메모안에 값이 있다면 출력
    else:
        result = fib(n-1) + fib(n-2)
        memo[n] = result
        return result

동적계획법 예시

이웃하지 않은 숫자들의 합의 최대값은?

data = [3, 4, 5 ,6, 1, 2, 5]
def solution(data):
    if len(data) == 1:
        return data[0]
    result = [data[0], max(data[0], data[1])]
    for i in range(2, len(data)):
        result.append(max(result[i-1], result[i-2] + data[i])
        return result[-1]

1:3

2: max(3, 4)->5

3:max(3+5, 4) ->8

4:max(8, 6+4) -> 10

5:max(10, 8+1) -> 10

6:max(10, 10+2) -> 12

7:max(12, 10+5) -> 15

위와 같은 형식의 포멧으로 과정들을 숫자로 하나씩 나열해보면 이웃하지 않은 수들의 최댓값을 추출할 수 있다.