ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Leetcode算法初学——动态规划算法“使用最小花费爬楼梯”

2020-06-19 12:04:11  阅读:268  来源: 互联网

标签:爬楼梯 花费 阶梯 int 算法 cost 100 Leetcode 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。

题解:

不同于简单的爬楼梯默认每阶楼梯花费体力都是1,本题爬到每阶楼梯的体力花费是不一样的,这道题我觉得难点就在于理解题意,特别是最后一句其实很容易忽略,“您需要找到达到楼层顶部的最低花费”,所以本题不是说检索到cost[n-1]后就结束了,而是要在cost[n-1]和cost[n-2]之间再做一次比较,因为还要再爬到楼顶。动态规划方程比较容易写出来,因为题目已经给了cost最小长度为2,所以不用再确定边界,直接将dp数组前两个赋值,自底向上,每次都是前面阶梯的最小值再加上新的阶梯就是走到那个阶梯的最小花费,f(x)=min(f(x-1),f(x-2))+cost[x],本体难点就在于自底向上一定要判断到楼顶的花费。

代码:

 1 class Solution {
 2 public:
 3     int minCostClimbingStairs(vector<int>& cost) {
 4         int dp[1000];
 5         dp[0]=cost[0];
 6         dp[1]=cost[1];
 7         int n=cost.size();
 8         for(int i=2;i<n;i++)
 9         {
10             dp[i]=min(dp[i-1],dp[i-2])+cost[i];
11         }
12         return min(dp[n-1],dp[n-2]);
13     }
14 };

运行结果:

 

 该算法时间复杂度为O(n)。难度简单。

 

标签:爬楼梯,花费,阶梯,int,算法,cost,100,Leetcode,dp
来源: https://www.cnblogs.com/feite/p/13162304.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有