DP: DFS with Memoization

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        min_cost = sys.maxsize
        dp = {}
 
        def dfs(step):
            if step >= len(cost):
                return 0
 
            if step == len(cost) - 1:
                return cost[step]
            
            if step in dp:
                return dp[step]
 
            cost1 = cost[step] + dfs(step + 1)
            cost2 = cost[step] + dfs(step + 2)
 
            dp[step] = min(cost1, cost2)
            return dp[step]
        
        return min(dfs(0), dfs(1))

Complexity

Time:
Space:

DP: Bottom-up (Optimal)

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        n = len(cost)
 
        for i in range(n - 3, -1, -1):
            cost1 = cost[i] + cost[i + 1]
            cost2 = cost[i] + cost[i + 2]
            cost[i] = min(cost1, cost2)
        
        return min(cost[0], cost[1])

Complexity

Time:
Space: