题目

On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed).

Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step with index 0, or the step with index 1.

Example 1:

Input: cost = [10, 15, 20]
Output: 15
Explanation: Cheapest is start on cost[1], pay that cost and go to the top.

Example 2:

Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
Output: 6
Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3].

Note:

  1. cost will have a length in the range [2, 1000].
  2. Every cost[i] will be an integer in the range [0, 999].

解法

这是一个动态规划问题,按照以下步骤来解决

1. 分析最优解的性质。并刻画其结构特征。

求最终的最小cost, 因为到最后的cost可以表示为

max(走到最后一层楼梯的最小cost,走到最后二层楼梯的最小cost)

2. 递归的定义最优解

递推定义:

cost = min(上一层的最小cost + 当前层cost, 上两层的最小cost + 当前层cost)

3. 以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。

我们需要记录每一层的最优值(最小cost)

定义stairCost数组 stairCost[i]表示走到第i层的最小cost

递推改为:

stairCost[i] = min(stairCost[i-2] + cost[i], stairCost[i-1] + cost[i]);

4 .依据计算最优值时得到的信息,构造问题的最优解。

最优解可以表示为

 min(stairCost[cost.size()-2] , stairCost[cost.size()-1]);

代码及注释

解法1:

class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
//定义一个数组 表示爬上每一层楼梯 需要的最少cost
vector<int> stairCost(cost.size(), 0);
//第一层楼梯和第二层楼梯的cost就是本身
stairCost[0] = cost[0];
stairCost[1] = cost[1];
//现在循环计算 后面每一层的最小cost for (int i = 2; i < cost.size(); i++) {
stairCost[i] = min(stairCost[i-2] + cost[i], stairCost[i-1] + cost[i]);
} //到达楼梯终点的最小cost 就是倒数第一层和第二层的最小cost值
return min(stairCost[cost.size()-2] , stairCost[cost.size()-1]);
}
};

扩展

还有一些非常类似的题目, 有异曲同工之妙

1. LeetCode70——Climbing Stairs

题目如下

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.

Example 1:

Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Example 2:

Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step

题目设定都差不多,都是一次只能爬一层或者两次, 问爬到终点的方法共有几种?

当楼梯层数大于2时, 到达当前位置的走法可以表示为:

total_way[n] = total_way [n - 1] + total_way [n - 2]

因为到达楼梯方式有两种, 一种是从前面一层走一步过来, 另外一种是从前面两层走两步过来, 总方法 就是两者之和

其次是目标解 可以表示为最后一层的方法数

代码如下

class Solution {
public:
int climbStairs(int n) {
//特殊数据处理 当n为 1 或 2时, 返回 1 和 2
if (n <= 2) {
return n;
}
//创建数组 用了保存走到当前位置共需要的方法
int * total_way = new int[n];
//初始化条件
//走到第一层一种走法
total_way[0] = 1;
//走到第二层要两种走法
total_way[1] = 2;
//循环递推求解
for (int i = 2; i < n; i++){
//递推式
total_way[i] = total_way[i - 2] + total_way[i - 1];
}
//目的解就是走到最后一块的走法
return total_way[n - 1]; }
};

LeetCode746 Min Cost Climbing Stairs(爬上楼梯的最小损失)的更多相关文章

  1. Leetcode746.Min Cost Climbing Stairs使用最小花费爬楼梯

    数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需 ...

  2. [LeetCode] Min Cost Climbing Stairs 爬楼梯的最小损失

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  3. [LeetCode] 746. Min Cost Climbing Stairs 爬楼梯的最小损失

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  4. leetcode746 Min Cost Climbing Stairs

    """ On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 inde ...

  5. LeetCode 746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 11

    746. 使用最小花费爬楼梯 746. Min Cost Climbing Stairs 题目描述 数组的每个索引做为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i].(索引从 0 ...

  6. Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs)

    Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost ...

  7. Min Cost Climbing Stairs - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Min Cost Climbing Stairs - LeetCode 注意点 注意边界条件 解法 解法一:这道题也是一道dp题.dp[i]表示爬到第i层 ...

  8. 【Leetcode_easy】746. Min Cost Climbing Stairs

    problem 746. Min Cost Climbing Stairs 题意: solution1:动态规划: 定义一个一维的dp数组,其中dp[i]表示爬到第i层的最小cost,然后来想dp[i ...

  9. 746. Min Cost Climbing Stairs@python

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

随机推荐

  1. OSCP Learning Notes - Capstone(1)

    Kioptrix Level 1.1 Walkthrough Preparation: Download the virtual machine  from the following website ...

  2. Arctic Code Vault Contributor 上榜了 go-admin v1.1 beta 版本发布

    Arctic Code Vault Contributor 上榜了,内心比较喜悦,谢谢开源社区的支持,也谢谢广大 coder 的支持: go-admin 是一个基于 Gin + Vue + Eleme ...

  3. vue : 使用stylus less (包括sublime插件支持)

    版本: vue 2.5.2 webpack 3.6.0 先说stylus. 用npm装个包. npm install stylus stylus-loader --save-dev 然后在.vue文件 ...

  4. P.SDA1.DEV - 一个没有服务器的图床

    图床特色 P.SDA1.DEV的愿景是为大家提供一个免费.长期稳定外链分享图片的选择. P.SDA1.DEV的主要特点有: 完全建构在Serverless云服务上,致力于提供(墙外)可用性99.9%的 ...

  5. reCAPTCHA无法加载?一个小工具就可以轻松解决!

    Chrome用户可以在应用商店搜索gooreplacer安装,或者点我下载,然后打开chrome://extensions/,将下载的crx文件拖入浏览器窗口,即可完成安装 Firefox用户可以在  ...

  6. SDS——重用StringBuilder

    package example.java; /** * @author 杜科 * @description 简单动态字符串,非线程安全.采取类似buffer的设计,使其成为一个可以方便重用的Strin ...

  7. 题解 洛谷 P2254 【[NOI2005]瑰丽华尔兹】

    发现在同一时间段中,滑动的方向具有唯一性,所以不难得出\(DP\)方程. \(f_{i,j}=max(f_{i,j},f_{i-dx_,j-dy}+dis_{i,j,i-dx_,j-dy})\) \( ...

  8. jmeter接口测试 -- Base64加密(函数助手添加自定义函数)

    图片转码 base64 致谢参考博客: https://www.cnblogs.com/qiaoyeye/p/7218770.html https://www.cnblogs.com/lasdaybg ...

  9. 解决react使用antd table组件固定表头后,表头和表体列不对齐以及配置fixed固定左右侧后行高度不对齐

    一.固定表头后表体列和表头不对齐 此问题可能在antd3.24.0版本之前都存在,反正3.16.2版本是存在这个问题的,如果是3.24.0之前的版本估计只能通过修改css样式解决. 按照官网说的: 1 ...

  10. Redis的各种数据类型到底能玩出什么花儿?

    https://mp.weixin.qq.com/s/ZSQ9vCkWXYuLrKS0UJ4RIg 两个星期终于肝了出来,Redis相关问题脑图,终于整理完了!!! 文末无套路分享~~附获取方式 Re ...