• 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 }
     
  • 相关阅读:
    JSTL日期格式化用法
    JSTL详解1
    Mybatis插入后返回主键
    JSTL详解2
    jsp与jsp之间传参数如何获取
    [转] J2EE面试题集锦(附答案)
    [转] 修炼一名程序员的职业水准(林庆忠原创)
    [转] 应聘Java笔试时可能出现问题及其答案(第三部分)
    [转] 与大家一起分享JAVA源代码查询网站
    [转] 应聘Java笔试时可能出现问题及其答案(第四部分)
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12557174.html
Copyright © 2020-2023  润新知