[リコウ] 746. 最小限のコストで階段を登る
整数配列のコストが与えられます。ここで、cost[i] は、階段の i 番目のステップを上るコストです。この料金を支払うと、階段を 1 段か 2 段登るかを選択できます。添字 0 または添字 1 の段から階段を登り始めるかを選択できます。
階段の一番上に到達するまでの最小コストを計算して返してください。
例 1:
入力: コスト = [10,15,20]
出力: 15
説明:
添字 1 のステップから開始します。
15を払って2段上の階段を上ります。
総コストは15です。
例 2:
入力:cost = [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です。
ヒント:
2 <=cost.length<=1000
0<=cost[i]<=999
答え
- dp 配列と添え字の意味を決定します。dp
[i] の定義は次のとおりです: dp[i] は、i 番目のステップに到達するために必要なエネルギーが最小です。 - 再帰式を決定する
dp[i] を取得するには 2 つの方法があります。1 つは dp[i-1]、もう 1 つは dp[i-2] dp
[i - 1] にジャンプするには dp[i - 1] が必要ですdp[i] ] + コスト[i - 1]
dp[i - 2] dp[i] にジャンプするには、
最小のもの、つまり状態遷移方程式を選択するためにdp[i - 2] + コスト[i - 2] を費やす必要があります。 dp[i] = min(dp [i - 1] + コスト[i - 1], dp[i - 2] + コスト[i - 2]); - dp 配列の初期化方法
添字 0 または添字 1 の段差から階段を登る場合、dp[0] = 0、dp[1] = 0 を選択します。
前から後ろへの走査順序を決定する- dp 配列を推定する例 (dp 配列を出力)
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
int[] dp = new int[len + 1];
// 从下标为 0 或下标为 1 的台阶开始,没跳没费用
dp[0] = 0;
dp[1] = 0;
// 遍历
for (int i = 2; i <= len; i++) {
dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[len];
}
}