# LC 746. Min Cost Climbing Stairs
### [Problem link](https://leetcode.com/problems/min-cost-climbing-stairs/)
###### tags: `leedcode` `python` `c++` `easy` `DP`
You are given an integer array <code>cost</code> where <code>cost[i]</code> is the cost of <code>i<sup>th</sup></code> step on a staircase. Once you pay the cost, you can either climb one or two steps.
You can either start from the step with index <code>0</code>, or the step with index <code>1</code>.
Return the minimum cost to reach the top of the floor.
**Example 1:**
```
Input: cost = [10,15,20]
Output: 15
Explanation: You will start at index 1.
- Pay 15 and climb two steps to reach the top.
The total cost is 15.
```
**Example 2:**
```
Input: cost = [1,100,1,1,1,100,1,1,100,1]
Output: 6
Explanation: You will start at index 0.
- Pay 1 and climb two steps to reach index 2.
- Pay 1 and climb two steps to reach index 4.
- Pay 1 and climb two steps to reach index 6.
- Pay 1 and climb one step to reach index 7.
- Pay 1 and climb two steps to reach index 9.
- Pay 1 and climb one step to reach the top.
The total cost is 6.
```
**Constraints:**
- <code>2 <= cost.length <= 1000</code>
- <code>0 <= cost[i] <= 999</code>
## Solution 1 - DP
#### Python
```python=
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0] * (len(cost) + 1)
for i in range(2, len(cost) + 1):
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
return dp[-1]
```
#### C++
```cpp=
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n + 1, 0);
for (int i = 2; i < n + 1; i++) {
dp[i] = min(dp[i- 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);
}
return dp.back();
}
};
```
```cpp=
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> cache(n + 1, -1);
function<int(int)> dfs = [&](int i) {
if (i <= 1) {
return 0;
}
if (cache[i] != -1) {
return cache[i];
}
cache[i] = min(dfs(i - 1) + cost[i - 1], dfs(i - 2) + cost[i - 2]);
return cache[i];
};
return dfs(n);
}
};
```
## Solution 2 - DP
#### Python
```python=
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0, 0]
for i in range(2, len(cost) + 1):
dp[0], dp[1] = dp[1], min(dp[0] + cost[i - 2], dp[1] + cost[i - 1])
return dp[1]
```
#### C++
```cpp=
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(2, 0);
for (int i = 2; i < n + 1; i++) {
int sum = min(dp[0] + cost[i - 2], dp[1] + cost[i - 1]);
dp[0] = dp[1];
dp[1] = sum;
}
return dp[1];
}
};
```
>### Complexity
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n) | O(n) |
>| Solution 2 | O(n) | O(1) |
## Note
X