DP:使用最小花费爬楼梯

数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始)。
每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。
您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 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~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 }
 
原文地址:https://www.cnblogs.com/ZhengLijie/p/12557174.html