# Climbing Stairs

Climbing Stairs is a classic algorithmic problem that often appears in coding interviews and computer science courses. The problem statement is as follows:

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?

The task is to find the total number of unique ways to reach the top of the staircase given the number of steps.

Here are a few key points about the Climbing Stairs problem:

1. It is a dynamic programming problem, which means it can be solved by breaking it down into smaller subproblems and storing the results to avoid redundant calculations.

2. The problem has an optimal substructure, meaning that the optimal solution to the problem can be constructed from optimal solutions of its subproblems.

3. The number of ways to reach the nth step can be calculated as the sum of the number of ways to reach the (n-1)th step and the number of ways to reach the (n-2)th step. This is because from the (n-1)th step, we can take a single step to reach the nth step, and from the (n-2)th step, we can take two steps to reach the nth step.

4. The base cases for this problem are:

• If there are 0 steps, there is only one way to climb (do nothing).
• If there is 1 step, there is only one way to climb (take one step).
5. The time complexity of the solution is O(n), where n is the number of steps. The space complexity can be optimized to O(1) by using variables to store only the necessary previous two values instead of an array.

Here's an example of how the solution works:

• Let's say we have 3 steps.
• To reach the 3rd step, we can either climb from the 2nd step (1 step) or from the 1st step (2 steps).
• The number of ways to reach the 2nd step is 2 (1 step + 1 step, or 2 steps).
• The number of ways to reach the 1st step is 1 (1 step).
• Therefore, the total number of ways to reach the 3rd step is 2 + 1 = 3.

The Climbing Stairs problem is a great way to practice dynamic programming and understand how to solve problems by breaking them down into smaller subproblems.