# 70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

 输入:n = 2
 输出:2
 解释:有两种方法可以爬到楼顶。
 1. 1 阶 + 1 阶
 2. 2 阶

示例 2:

 输入:n = 3
 输出:3
 解释:有三种方法可以爬到楼顶。
 1. 1 阶 + 1 阶 + 1 阶
 2. 1 阶 + 2 阶
 3. 2 阶 + 1 阶

# 记忆化搜索

class Solution:
    def climbStairs(self, n: int) -> int:
        @cache
        def dfs(i: int) -> int:
            if i <= 1:
                return 1
            # 总方案数量
            ans = 0
            # 选择 i - 1
            ans += dfs(i - 1)
            # 选择 i - 2
            ans += dfs(i - 2)
            return ans
        return dfs(n)

# 动态规划

class Solution:
    def climbStairs(self, n: int) -> int:
        # dp [i]: 爬到第 i 阶的所有方法数
        #   dp[i] = dp[i - 1] + dp[i - 2]
        dp = [0] * (n + 1)
        dp[0] = 1
        dp[1] = 1
        for i in range(2, n + 1):
            dp[i] = dp[i - 2] + dp[i - 1]
        return dp[n]

# 空间优化

只需要知道 dp(i1)dp(i - 1) 就行了。

class Solution:
    def climbStairs(self, n: int) -> int:
        # dp [i]: 爬到第 i 阶的所有方法数
        #   dp[i] = dp[i - 1] + dp[i - 2]
        n_i0 = 1
        n_i1 = 1
        n_i = 1
        for i in range(2, n + 1):
            n_i = n_i0 + n_i1
            n_i0 = n_i1
            n_i1 = n_i
        return n_i