數組的每個索引做爲一個階梯,第 i
個階梯對應着一個非負數的體力花費值 cost[i](索引從0開始)。
每當你爬上一個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬一個階梯或者爬兩個階梯。
您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引爲 0 或 1 的元素作爲初始階梯。
/**
* Created by Joe on 2018/4/7.
* 746. Min Cost Climbing Stairs
* https://leetcode.com/problems/min-cost-climbing-stairs/description/
*/
public class P746 {
public int minCostClimbingStairs(int[] cost) {
return Math.min(getCost(cost, 0), getCost(cost, 1));
}
private int getCost(int[] cost, int i) {
if (i >= cost.length) return 0;
return cost[i] + Math.min(getCost(cost, i + 1), getCost(cost, i + 2));
}
}
最開始的代碼,提示是在最後一個測試用例超時了。
之後看了討論區,都說是用DP。
還是對題目缺乏思考:只要發現劃分成子任務是非獨立的任務,即每一個子任務都需要依賴其他子任務的結果時候,就應該考慮使用DP。
代碼:
public int minCostClimbingStairs(int[] cost) {
if(cost == null)
return 0;
if(cost.length == 1)
return cost[0];
if(cost.length == 2)
return Math.min(cost[0],cost[1]);
int[] tmp = new int[cost.length];//記錄着必須選擇第i階臺階時,最小代價
tmp[0] = cost[0];
tmp[1] = cost[1];
for(int i = 2; i < tmp.length; i++) {
tmp[i] = Math.min(tmp[i - 2], tmp[i - 1]) + cost[i];
}
return Math.min(tmp[tmp.length - 1], tmp[tmp.length - 2]); //最後一步可以從最後一個臺階或者倒數第二個臺階跨越
}