BAEKJOON 2748フィボナッチ数2


BAEKJOON 2748フィボナッチ数2


質問する


https://www.acmicpc.net/problem/2748

に答える


フィボナッチ数列は、再帰呼び出しによって解く典型的な例である.しかし,欲しい値が大きいと回帰は非常に非効率である.従って、dpを用いることで、既存の計算値を非常に効率的に解放することができ、時間を大幅に短縮することができる.
この問題は上から下へと下から上への2つの方法に分かれている.
まずdpに初期値を設定し、n番目の数字に順番に記入する方法はbottom-upです.
dpに初期値が設定され、既存の値が再帰呼び出しでメモリに存在する場合、この値を使用して再帰呼び出しを行わない方法はtop-down方式である.

コード#コード#

N = int(input())
#상향식
def fib(n):
    if n==0:                        # 초기값 0, 1 설정
        return 0
    if n==1:
        return 1
    for i in range(2, n+1):         # bottom-up 방식으로 2부터 n까지 순차적으로 dp를 채워감, 이떄 해당 값은 기존에 계산 해놓은 값을 이용하여 계산
        dp[i] = dp[i-1]+dp[i-2]
    return dp[i]

#하향식
def fib(n):                         # top-down 방식
    if n==0:                        # 초기값 0, 1 설정
        return 0
    if n==1:
        return 1
    if dp[n]!=0:                    # dp에 n 값이 존재한다면 해당 값 return
        return dp[n]
    dp[n] = fib(n-1) + fib(n-2)     # dp에 n 값이 존재하지 않는다면 재귀 함수를 호출해서 해당 결과를 dp에 담아줌
    return dp[n]                    # 위에 담긴 dp 값을 통해 다음 재귀는 dp[n] 을 return함으로 한 번 했던 재귀 호출은 다시 하지 않음

dp =[0] * 301
dp[0] = 0
dp[1] = 1

print(fib(N))

結果



dpでこの問題を解決することを知っているので、簡単に解決できます.基本dpの形態を理解し,他の形態にdpを適用して解くよう努力した.