1.トピックの紹介
配列の各インデックスはラダーとして機能し、i番目のラダーは非負の物理的労力コスト[i]に対応します(インデックスは0から始まります)。はしごを登るたびに、対応する物理的なコスト値を費やす必要があります。その後、1つのはしごを登り続けるか、2つのはしごを登り続けるかを選択できます。あなたは床の最上部に到達するために最低のコストを見つける必要があります。最初に、インデックス0または1の要素を初期ラダーとして選択できます。
示例 1:
输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
示例 2:
输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
注意:
cost 的长度将会在 [2, 1000]。
每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。
2つの問題解決のアイデア
この問題は、動的計画法によって解決できます。状態遷移方程式は次のとおりです。dp[i] = min(dp [i-1]、dp [i-2])+ cost [i]これは、任意のステップiを通過するときに、費やされる最小の物理的強度がdpであることを意味します。 [i]。注意すべきことの1つは次のとおりです。
(1)一度に1ステップ上がるか、一度に2ステップ上がるかを選択できます。
(2)コスト配列には床の最上部は含まれません。size= cost.size()とすると、cost [size]は建物の最上部を表します。
上記の2点を明確にするために、動的伝達方程式に従ってプログラムすることができます。詳細については、コードを参照してください。
3つの問題解決コード
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n, 0);
dp[0] = cost[0];
dp[1] = cost[1];
for(int i = 2; i < n; ++i)
{
dp[i] = min(dp[i-2], dp[i-1]) + cost[i];
}
return min(dp[n-1], dp[n-2]);
}
};