###### tags: `Leetcode` `easy` `dynamic programming` `python` `c++`
# 746. Min Cost Climbing Stairs
## [題目連結:] https://leetcode.com/problems/min-cost-climbing-stairs/description/
## 題目:
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.
**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.
```
## 解題想法:
* 題目為,
* 每個台階都有個cost,求爬到最頂端的位置(len(cost)+1)的cost最小為多少
* 可以從0 or 1階 開始走:
* 每次能走1 or 2階
* 使用DP:
* dp[i]表示到達第i階的最小cost
* dp[i]=min(dp[i-1],dp[i-2])+cost[i] if i>1
* 最頂端可由 最後一階or 倒數第二階 到達:
* return min(dp[-1],dp[-2])
## Python:
``` python=
class Solution(object):
def minCostClimbingStairs(self, cost):
"""
:type cost: List[int]
:rtype: int
"""
n=len(cost)
dp=[0 for _ in range(n)]
dp[0]=cost[0]
dp[1]=cost[1]
for i in range(2,n):
dp[i]=min(dp[i-1],dp[i-2])+cost[i]
return min(dp[-1],dp[-2])
if __name__=='__main__':
result=Solution()
ans=result.minCostClimbingStairs(cost = [1,100,1,1,1,100,1,1,100,1])
print(ans) #6
```
## C++:
``` cpp=
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
vector<int> dp(n);
dp[0]=cost[0];
dp[1]=cost[1];
for (int i=2; i<n; i++){
dp[i]=min(dp[i-1],dp[i-2])+cost[i];
}
return min(dp[n-1],dp[n-2]);
}
};
int main(){
vector<int> cost{10,15,20};
Solution res;
int ans=res.minCostClimbingStairs(cost);
cout<<ans<<endl; //15
return 0;
}
```