zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    EM and GMM(Code)
    EM and GMM(Theory)
    安装Sphere v2.7 遇到的问题
    pyqt的 .ui 转换为 .py 后的操作注意事项
    SVM入门(一)
    关于范数的理解
    快速排序的C语言实现
    QT编程环境搭建
    flex布局左边固定,右边自适应,右边内容超出会影响布局
    未知宽高的div怎么垂直水平居中
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12557174.html
Copyright © 2011-2022 走看看