You are climbing a staircase. It takes n steps to reach the top.
Each time you can either climb 1 or 2 steps.
In how many distinct ways can you climb to the top?
ex)

climb_stairs(i, n) = climb_stairs(i+1, n) + climb_stairs(i+2, n)
i: 현재 위치, n: 목적지
def climb_stairs(i, n):
if i>n:
return 0
if i==n:
return 1
return climb_stairs(i+1,n) + climb_stairs(i+2,n)
class Solution:
def climbStairs(self, n: int) -> int:
return climb_stairs(0,n)
→ O(2^n)
이렇게 할 경우, 노드를 방문할 때 마다 매번 계산을 해줘야 하기 때문에 시간 초과가 난다. 중복되는 계산을 방지하기 위해, 이전 계산값을 저장했다가 해당 값이 필요할 때 꺼내쓰는 Memoization 방식을 통해 시간복잡도를 낮춰준다.

def climb_stairs(i, n, memo):
if i>n:
return 0
if i==n:
return 1
if memo[i]>0:
return memo[i]
memo[i] = climb_stairs(i+1,n,memo) + climb_stairs(i+2,n,memo)
return memo[i]
class Solution:
def climbStairs(self, n: int) -> int:
memo=[0]*(n+1)
return climb_stairs(0, n, memo)
→ O(n)
dp[n] = dp[n-1]+dp[n-2]
class Solution:
def climbStairs(self, n: int) -> int:
dp=[1,1]
for i in range(2, n+1):
dp.append(dp[i-1] + dp[i-2])
return dp[n]
→ O(n)