# Leetcode Climbing-Chairs

#### 2022-07-20 14:37

> ##### Algorithms:
>
> #algorithm #dynamic_programming
>
> ##### Difficulty:
>
> #coding_problem #difficulty-easy
>
> ##### Additional tags:
>
> #leetcode
>
> ##### Revisions:
>
> N/A

##### Related topics:

##### Links:

- [Link to problem](https://leetcode.com/problems/climbing-stairs/submissions/)

---

### Problem

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?

#### Examples

**Example 1:**

**Input:** n = 2
**Output:** 2
**Explanation:** There are two ways to climb to the top.

1. 1 step + 1 step
2. 2 steps

**Example 2:**

**Input:** n = 3
**Output:** 3
**Explanation:** There are three ways to climb to the top.

1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step

#### Constraints

- `1 <= n <= 45`

### Thoughts

> [!summary]
> This is a #dynamic_programming problem. our solution relies on other solutions

I had come up with an recursive solution, with a little bit of optimizations.

#### First iteration:

Base case:

- n is 0, 1, 2:
  return n

Pseudo code:
answer = climb(n - 1) + climb(n - 2);

This is a brute force-y solution, because there are too much combinations, and we are re-calculating solutions.

#### Second iteration:

Base case:

- n = 1, 2, **3**
  Return n

Note that n == 3 is added, because we will calculate n - 3, which otherwise will make n = 0

and when n == 0, it should return 1.

> [!tips] Optimization
> We can optimize it because some solutions can be
> calculated and used for both 1 step and 2 steps.
>
> how many ways to climb: one step or two steps
> 1 + 1 = 2
> 0 + 2 = 2
> 1 + 2 = 3
> -> 2 x climb two steps, and 1 x climb 3 steps

### Solution

Optimized version:

```cpp
class Solution {
public:
  int climbStairs(int n) {
    // Dymanic programming, using solution from the past
    // Recursive, base case: n == 0, 1, 2, 3
    if (n <= 3) {
      return n;
    }

    // how many ways to climb: one step or two steps
    // 1 + 1 = 2
    // 0 + 2 = 2
    // 1 + 2 = 3
    // -> 2 * climb two steps, and 1 * climb 3 steps
    return 2 * climbStairs(n - 2) + climbStairs(n - 3);
  }
};
```
