自顶向下分析,要想爬上 n 阶台阶,由于一次可以爬 1 或 2 阶台阶,所以爬上 n 阶台阶有两种可能:
经过上面的分析,我们知道了一级、二级和三级台阶的跳法,现在要我们求 n 级台阶的跳法,我们可以这样思考:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 class Solution { public int climbStairs(int n) { //定义一个数值 res[n]等于爬n阶的方法数量。因为数组的下标从0开始,所以数组的长度为n+1。
https://leetcode-cn.com/problems/climbing-stairs/
又到了每周的算法时间了,今天给大家带来一道很经典,又很简单,又比较适合对动态规划极度恐惧的童鞋,做动态规划的题,一定要学会分析,慢慢找到状态转移方程,不多说,来看看题目:
思路解析 这一题与上述的那一题大同小异,只要注意一些小问题,显然该题的状态转换方程也和上题差不多,但是这题,有一个不同的地方就是,他不仅可以跳一步,两步,他还能跳三步,甚至是N步,所以,显然N阶的方案里面肯定也包括了在跳N-3阶的基础上再跳3阶的方案。一次类推,所以显然 dp[i]=dp[i-1]+dp[i-2]+…+dp[1],你以为这样就结束了吗?NONONO,不要忘记了,他还能跳N阶,所以状态方程应该是dp[i]=dp[i-1]+dp[i-2]+…+dp[0]+1。 源代码
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
解题思路: 利用异或运算符解答: 0 ^ a = a; 当一个数重复异或会抵消: a ^ b ^ a = b; 那么我们将1-N个数异或,再将nums[]中的数异或,就得到了消失的两个数的异或值。 之后将出现的数分为 二进制表示的第 1 位为 0 的数,和 二进制表示的第 1位为 1 的数。 将他们异或,消除重复,就分别得到了两个消失的数。
f[n] = f[n-1] + f[n-2]如何理解? 爬楼梯一次可以一阶或者两阶,爬到第n层台阶有多少种方案。 逆向思考,当现在处于第n阶台阶,从哪里可以到这里呢? 从n-1阶台阶爬一层到这里或者从n-2阶台阶爬两层到这里,也就爬到第n的方案数是爬到第n-1阶台阶的方案数与爬到第n-2阶台阶的方案数之和,加法原理。
题目中说只能爬一个台阶或两个台阶 那么:爬到第N阶方法数=再 爬一个台阶的方法+再 爬两个台阶的方法 第1阶:1+0 1 第2阶:1+1 2 第3阶:2+1 3(ps:再爬一个台阶;即从第2开始爬,爬到2的方法有两种,那么这两种从2到3都是爬1阶,所以再爬一个台阶方法有两种,爬两个台阶:从1开始,到一方法只有一种,1到3阶就是再一次爬两阶) 依次类推 可以得到一个递推式;F(n)=F(n-1)+F(n-2) (F表示方法数,n表示台阶数) 即可转化为斐波拉切数列问题
https://github.com/Coxhuang/Python-DataStructure
动态规划,是一种解决棘手问题的方法,它将问题分成小问题,并从解决小问题作为起点,从而解决最终问题的一种方法。
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
思想: 闫氏DP法 状态表示 集合:f[i]表示到第i阶所花费最小的体力值 属性:min 状态计算 当前第n阶台阶可以从第n-1阶台阶爬一阶或者第n-2阶台阶爬两阶到达第n阶。 所花费的体力的最小值是(从第n-1阶台阶爬一阶或者第n-2阶台阶爬两阶到达第n阶中体力最小值) 加上当前层所有要的体力消耗。 状态转移方程,f[i] = min(f[i - 1], f[i - 2]) + cost[i]; class Solution { public: int minCostClimbingSta
以为真easy的我天真地用了递归,然后超时了。。。敲 ——leetcode此题热评 前言 哈喽,大家好,我是一条。 糊涂算法,难得糊涂。 今天我们爬楼梯! Question 难度:简单 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入:2 输出:2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入:3 输出:3 解释: 有三种方法可以爬到
思路:动态规划 爬到第 xx 级台阶的方案数是爬到第 x - 1x−1 级台阶的方案数和爬到第 x - 2x−2 级台阶的方案数的和
编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化和锻炼自己的编程能力(最起码不会忘记编程)
推演得到公式:dp[i] = dp[i-1] + dp[i-2] 你还可以使用动态规划来解题呀,具体思路如下:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 提示: 1 <= n <= 45 原题链接 /** * @param {number} n * @return
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
在m×n的矩阵A中,任取k行、k列(k小于等于m、k小于等于n),位于这些行和列交叉处的 个元素,在不改变原有次序的情况下组成的矩阵叫做矩阵A的k阶子式。
这种思想的本质是:一个规模比较大的问题(可以用两三个参数表示的问题),可以通过若干规模较小的问题的结果来得到的(通常会寻求到一些特殊的计算逻辑,如求最值等),如下图所示,一个大规模的问题由若干个子问题组成。
5,总结,趴台阶这样的题算是递归一类的题了,对于这样的解法也没什么好说的了,因为看了上面我的解题思路,自己已想到了如何编写程序了。自己总结一下就是为了便于以后查看方便, 当回首过往,一切的一切都是那么值得,自己有的时候也不喜欢在文章的后面唠嗑这些,主要还是标记原创了,字数必须达到一定的字数。
讲解动态规划的资料很多,官方的定义是指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。概念中的各阶段之间的关系,其实指的就是状态转移方程。很多人觉得DP难(下文统称动态规划为DP),根本原因是因为DP区别于一些固定形式的算法(比如DFS、二分法、KMP),没有实际的步骤规定第一步第二步来做什么,所以准确的说,DP其实是一种解决问题的思想。
题意 假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 样例 n=1 方法只有一种就是1 n=2 1+1 或者 2 两种方法 n=3 1+1+1 或者 1+2 或者 2+1 三种方法 ….. 思路 逆向思维,例如 n = 4 ,那么他走的最后一步就只能是 1步 或者 2步, 如果最后走的是1级台阶,那么之前走的就是3级台阶, 如果之前走的是2级台阶,那么之前走的就是2级台阶, 于是得到4阶台阶的走法就是3阶台阶的走法加上2阶台阶的走法。也就是3 +
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
算法是面试中出现频次最高,也是比较烧脑的题目;但真正的大牛还是不会太在乎面试中出现的这些题目,因为在他们看来,这些已经在大脑中演算了上百次。
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
力扣题目链接:https://leetcode-cn.com/problems/climbing-stairs
之前讲这道题目的时候,因为还没有讲背包问题,所以就只是讲了一下爬楼梯最直接的动规方法(斐波那契)。
假设还有n阶要跳,那么这一次有n种跳法 1 2 3...n,而且当我们跳i个台阶后则下次有n-i个台阶可以跳...直到跳到最后一阶整个跳台阶结束,算一种方法 这里的sum则统计了所有的结果
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
1、题目: 现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39。
由题目可知,青蛙一次可以跳一阶或者两阶。假设台阶为N阶,我们可以这样想:
这题目读完有一种将动态规划 DP(做比较得最大值或最小值)和 爬楼梯斐波那契结合的感觉。
根据题意,需要爬 n 阶楼梯才能到达楼顶,并且每次只能爬1或2个台阶,问有几种方法?
当n等于2的时候,可以先跳一级再跳一级,或者直接跳二级,共有2种跳法,记f(2)=2
程序调用自生的编程技巧称作递归。所谓递归就必然存在着递出与回归,递归的全过程其实是将一个问题分成若干个解法相同的问题,将初始的数据一直往后传送,当到达一个临届值后开始回归,从原路返回实现问题的解决。 递归策略使得只需要少量的程序就可以描述出解题中多次重复的计算,大大减少了代码的长度。 递归的精髓就在于大事化小。
题目: 给定一个有N个台阶的楼梯,一个人从下到上开始跳台阶,这个人有两种跳的方式:一次跳一个台阶,一次跳两个台阶; 问:从台阶底端跳到台阶顶端,有多少种跳台阶的方式? 分析: 首先我们考虑最简单的情况。如果只有1个台阶,那么显然只有一种跳法;如果 是2级台阶,那么有2种跳法。对于一个有n级台阶的楼梯来说,我们设跳法为 f(n) ,假如我们先跳1个台阶,则剩下有 n-1 个台阶,跳法为 f(n-1) 次,假如我们先跳2个台阶,则剩下 n-2 阶,跳法为 f(n-2);由此可以推出,对于一个n阶的楼梯,有以下这
在前面算法题目解析:从一道题目看动态规划这篇文章中,描述了动态规划的概念、原理和典型示例,今天用几道典型的动态规划题目来做为练手,达到掌握的目的。70. 爬楼梯是一道简单题,但比较典型,先从它开始。
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50)。 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法。 样例输入: 6 样例输出: 32 解题思路: 这道题目跟之前的跳台阶大同小异,只是跳台阶的阶数从1变到了n,也就是说,不再是跳一下或者跳两下的问题,而是跳n下的问题。那么解题的思路显然还得逆向分析,我们发现:
到第一个台阶只有一个方法,到第二个台阶有两个方法,分别是 1+1 或 2,因此直接返回 n 即可。
1、有一只免子要下台阶,每步只能下2阶台阶或3阶台阶,现在有一段楼梯,台阶数未知,请写一段代码能算出来他最少需要几步能下完所有的楼梯。(如果无论下多少次都无法下来请返回-1) n表示台阶数
3525:上台阶 总时间限制: 1000ms 内存限制: 65536kB描述 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。 输入输入的每一行包括一组测试数据,即为台阶数n。最后一行为0,表示测试结束。输出每一行输出对应一行输入的结果,即为走法的数目。样例输入 1 2 3 4 0 样例输出 1 2 4 7 1 #include<iostream> 2 #include<cstdio> 3 #include
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
领取专属 10元无门槛券
手把手带您无忧上云