整数配列のコストが与えられます。ここで、cost[i] は、階段の i 番目のステップを上るコストです。この料金を支払うと、階段を 1 段か 2 段登るかを選択できます。
添字 0 または添字 1 の段から階段を登り始めるかを選択できます。
階段の一番上に到達するまでの最小コストを計算して返してください。
例1
入力: コスト = [10,15,20]
出力: 15
説明: インデックス 1 のステップから開始します。
15を払って2段上の階段を上ります。
総コストは15です。
例 2
入力: コスト = [1,100,1,1,1,100,1,1,100,1]
出力: 6
説明: インデックス 0 のステップから開始します。
1を払って2段登ると添字2の段に着きます。
1 を支払い、4 とマークされた段まで 2 段登ります。
1を払って2段登ると添字6の段に到達します。
1を払って一段上がると下付き文字7の段に到達します。
1 を支払い、2 段を登ると下付き文字 9 の段に到達します。
1を支払い、一段上がって階段の上まで行きます。
合計コストは6です。
ほどく:
方法 1
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
//创建dp数组
vector<int> dp(cost.size()+1);
//初始化
dp[0]=dp[1]=0;
//填表
for(size_t i=2;i<=cost.size();i++)
{
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
//返回值
return dp[cost.size()];
}
};
方法 2
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int len=cost.size();
//创建dp数组
vector<int> dp(len);
//初始化
dp[len-1]=cost[len-1];
dp[len-2]=cost[len-2];
//数组赋值
for(int i=len-3;i>=0;i--)
{
dp[i]= min(dp[i+1]+cost[i],dp[i+2]+cost[i]);
}
//返回值
return min(dp[0],dp[1]);
}
};