#动态规划 LeetCode 70 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

1 阶 + 1 阶
2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶

思路:关于动态规划的问题,一般选择先使用递归的思路切入问题。以本题为例:
  • 递归的思路,我们要确定当前递归函数的定义。假设,当前我们把当前函数F(n),定义为走完n阶楼梯全部走法。下一步,我们来把它分解为子问题F(n-1)与F(n-2),分别代表走到倒数第一阶梯和倒数第二阶梯的全部走法数量。
  • 在F(n-1)状态下,我们只需要走一步即可走到n,F(n-2)同理。所以问题可以提出状态转移方程:F(n) = F(n-1)+F(n-2)
  • 依照上述思路,我们可以把F(n)分解为一个树形结构。即
  • 状态转移方程可以写作:F(n) = F(n-1)+F(n-2)= F(n-2)+F(n-3)     +       F(n-3)+F(n-4)。
  • 我们将对应的树形结构反过来从叶子结点开始观察。F(2) = F(1)+ F(0) 发现状态转移方程从下至上也是成立的。
  • 所以我们按照状态转移方程从F(0)、F(1)带入转移方程,即可依次计算出F(n)。
  • F(2) = F(1)+ F(0) FF(3) = F(2)+ F(1)。。。。。。。。。。。。。F(n-1) = F(n-2)+ F(n-3)  F(n) = F(n-1)+F(n-2)
  • 使用for循环即可计算出所求的F(n)
直接使用动态规划去思考确实有一定难度,如果我们使用递归的思路自上而下思考找到状态转移方程作为切入点,才是解题的方法
class Solution {
    public int climbStairs(int n) {
        int[] res = new int[n+1];
        for(int i =0 ; i<res.length ; i++)
            res[i] = -1;

        res[0] = 1;
        res[1] = 1;
        for(int i = 2 ; i<= n; i++)
            res[i] = res[i-1] + res[i-2];

        return res[n];
    }
}

原文地址:https://www.cnblogs.com/rainxbow/p/9695415.html

时间: 2024-11-11 01:26:10

#动态规划 LeetCode 70 爬楼梯的相关文章

[leetcode] 70. 爬楼梯

70. 爬楼梯 最简单的动态规划 假设f[i]表示爬到第i层有几种爬法 那么状态转移方程为:f[i] = f[i-1] + f[i-2] 初始条件显然是:f[1]=1,f[2] = 2; class Solution { public int climbStairs(int n) { if (n == 1) return 1; int f[] = new int[n]; f[0] = 1; f[1] = 2; for (int i = 2; i < n; i++) { f[i] = f[i -

leetcode 70. 爬楼梯(Climbing Stairs)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶. 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶. 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 解法: clas

LeetCode 70 - 爬楼梯 - [递推+滚动优化]

假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方法可以爬到楼顶.1. 1 阶 + 1 阶2. 2 阶 示例 2: 输入: 3输出: 3解释: 有三种方法可以爬到楼顶.1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 设 $f[n]$ 表示跳上 $n$ 级台阶的方案数目,因此很容易得到 $f[n] = f[n-1

LeetCode 题解 | 70. 爬楼梯

假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶. 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶. 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 Code class Solution { public: int climb

菜鸡学算法--70. 爬楼梯

先来看题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方法可以爬到楼顶.1. 1 阶 + 1 阶2. 2 阶 示例 2: 输入: 3输出: 3解释: 有三种方法可以爬到楼顶.1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 作为一个菜鸡,看到题目直接懵逼,思路混乱. 解题大招: 首先,计算可执行的逻辑最后

70. 爬楼梯

假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶. 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶. 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 class Solution { public int climbStairs

Leetcode -- 爬楼梯(70)

题目描述:假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶? 思路:分为两种情况,最后一步爬1个台阶或者最后一步爬2个台阶,二者之和即为所有的可能的方法.首先想到了递归算法,很不幸的是当n=38时就已经超时了.另外两种方法,斐波拉契数列以及动态规划法. 思路一:动态规划法 初始化dp[0]=0,dp[1]=1.dp[n]=dp[n-1]+dp[n-2] 1 class Solution: 2 def climbStairs(self

动态规划(斐波那契系列)---爬楼梯

动态规划 ??递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保留了子问题的解,避免了重复计算. 爬楼梯 70. Climbing Stairs (Easy) 题目描述: ??有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法. 思路分析: ??定义一个dp数组存储上楼梯的方法数,dp[i]表示走到第i层楼的方法数,第i层楼梯可以从第i-1层和i-2个楼梯再走一步到达.那么走到第i层楼梯的方式为走到第i-1层的方式和第i-2层的方式和. dp[ i

LeetCode | 0070. Climbing Stairs爬楼梯【Python】

LeetCode 0070. Climbing Stairs爬楼梯[Easy][Python][动态规划] Problem LeetCode 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