• 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 }
     
  • 相关阅读:
    [ZJOJ] 5772【NOIP2008模拟】今天你AK了吗
    exgcd扩展欧几里得求解的个数
    Dinic当前弧优化 模板及教程
    [Luogu] P3907 圈的异或
    提升——树形DP
    C++ 优先队列
    C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP
    C++ 洛谷 2014 选课 from_树形DP
    C++ luogu1352没有上司的舞会 from_树形DP
    浅说——树形DP
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12557174.html
Copyright © 2020-2023  润新知