使用最小花费爬楼梯是爬楼梯问题的延续,其题面为
给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。
支付该费用后,可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始。
计算到达楼梯顶部的最低花费。
实例如下:
cost = {10,15,20,16}
答案是30,花费10从0号台阶出发,上两级台阶到达2号台阶,再花费20上两级到到顶端也就是第4号台阶。
解题思路如下:
首先,我们有两个选择作为出发点,第一个选择是花费cost(0)从0号台阶出发,第二个选择是花费cost(1)从1号台阶出发, 如果从0号台阶出发,下一步的选择是上一级台阶到达1号台阶,或是上两级台阶到达2号台阶从;如果从1号台阶出发,下一步的选择是上一级台阶到达2号台阶,或是上两级台阶到达3号台阶。以此类推,我们可以用下面的数学表达式来描述这个问题:
F(k)
=0, (k = N)
=cost[k] + min(F(k + 1), F(k + 2))
其中k是0开始的数组下标,N是cost数组的长度。而最终的答案就是F(0)和F(1)之间较小的一个。
Java代码实现如下:
class BottomUp {
public int minCostClimbingStairs(int[] cost) {
int N = cost.length;
int[] dp = new int[N + 1];
dp[N - 1] = cost[N - 1];
for (int i = N - 2; i >= 0; i --) {
dp[i] = cost[i] + Math.min(dp[i + 1], dp[i + 2]);
}
return Math.min(dp[0], dp[1]);
}
}
上面的代码中使用了一个长度为N + 1的DP数组,与斐波那契数列问题类似,我们可以进行进一步的优化来减少空间复杂度。