数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始)。
每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。
您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。
示例 1:
输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
示例 2:
输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
注意:
cost 的长度将会在 [2, 1000]。
每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。
思路:题目已经说了2~1000,因此无须特判。
1.每一个位置可以上一层,可以上两层。
2.在同一个阶梯上一层以及上两层的体力花费一样,但是不同阶梯花费不一样。
3.状态方程dp[i] = cost[i] + min(dp[i-1], dp[i-2]);
4.输出min(dp[costSize-1],dp[costSize-2]).
类似于爬楼梯,每一阶都有两种选择,这一阶的方法就是F[N-1]+F[N-2]种方法,而这里是收费,每个状态的费用都得到了记录,取两种上楼方法种花费少的
那一种,最后输出也是,因为上最后一阶可能会有两种情况,所以取最小。
1 int minCostClimbingStairs(int* cost, int costSize) 2 { 3 int *dp; 4 5 dp = (int *)malloc(sizeof(int)*costSize); 6 dp[0] = cost[0]; 7 dp[1] = cost[1]; 8 for(int i=2; i < costSize; i++) 9 { 10 dp[i] = cost[i] + (dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]); 11 } 12 return dp[costSize-1] < dp[costSize-2] ? dp[costSize-1] : dp[costSize - 2]; 13 }