# [LeetCode 746. Min Cost Climbing Stairs ](https://leetcode.com/explore/challenge/card/june-leetcoding-challenge-2021/603/week-1-june-1st-june-7th/3770/)
### Daily challenge Jun 7, 2021 (EASY)
>You are given an integer array `cost` where `cost[i]` is the cost of ith 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 `0`, or the step with index `1`.
>
>Return the minimum cost to reach the top of the floor.
:::info
**Example 1:**
**Input:** cost = [10,15,20]
**Output:** 15
**Explanation:** Cheapest is: start on cost[1], pay that cost, and go to the top.
:::
:::info
**Example 1:**
**Input:** cost = [1,100,1,1,1,100,1,1,100,1]
**Output:** 6
**Explanation:** Cheapest is: start on cost[0], and only step on 1s, skipping cost[3].
:::
:::warning
**Constraints:**
* 2 <= cost.length <= 1000
* 0 <= cost[i] <= 999
:::
---
### Approach 1 : DP :bulb:
**`4 ms ( 94.32% )`** **`O()`**
初始位置可以在 **`index 0 or 1`**,一次可以走 **`1 or 2 steps`**。
所以要走到 `index = i` 的位置只能從 `index = ( i - 1 ) or index = ( i - 2 )`,
那我們只需要從低樓層開始判斷到頂樓,找出走道每層樓所需的 `minimum cost` 即可。
> Initial state : `dp[0] = 0, dp[1] = 0`。
> ---> **`dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])`**。
```cpp=1
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int size = cost.size();
int dp[size + 1];
dp[0] = 0;
dp[1] = 0;
for(int i=2; i<=size; i++){
dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
}
return dp[size];
}
};
```