zoukankan      html  css  js  c++  java
  • leetcode50之爬楼梯

    题目描述:

    假设你正在爬楼梯。需要 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 阶
    来源:https://leetcode-cn.com/problems/climbing-stairs/

    代码实现:
    def climbStairs(n):
        '''
        动态规划求解
        :return:
        '''
        dp = [0] * (n + 1)
        dp[0] = 1
        dp[1] = 1
        for i in range(2, n + 1):
            dp[i] = dp[i - 1] + dp[i - 2]
    
        return dp[n]
    
    
    print('------测试climbStairs()--------')
    print(climbStairs(5))
    
    
    def climbStairs1(n):
        '''
        斐波那契额数列求解
        :return:
        '''
        a = pow(0.5 * (1 + 5 ** 0.5), n + 1) - pow(0.5 * (1 - 5 ** 0.5), n + 1)
        res = 1 / (5 ** 0.5) * a
    
        return int(res)
    
    
    print('------测试climbStairs()--------')
    print(climbStairs1(5))

    总结:动态规划:在整个爬楼梯过程中,每次既可以迈1步,也可以迈两步。假设要爬阶数为n的楼梯,用dp[n]表示爬n阶楼梯所有爬法,当第一步为1时,剩下楼梯爬法为dp[n-1];当第一步为2时,剩下楼梯爬法为dp[n-2]。因此可得出动态规划方程为dp[n]=dp[n-1]+dp[n-2]。求取边界条件dp[1]=1(台阶数为1 时,只有一种爬法),dp[0]=1(假设条件)根据上述动态方程可编码如方法1所示

    斐波那契数列求解:从动态规划转移方程可以看出,存在递推公式dp[n]=dp[n-1]+dp[n-2],dp[0]=1,dp[1]=1(n>=2),此递推公式正好是斐波那契递推公式(从1开始,题目从0开始)

    编码如方法2

  • 相关阅读:
    获取非行间样式
    获取非行间样式
    prompt 方法显示输入对话框
    comfirm 方法显示对话框
    移动端页面常见问题及解决方案
    原生js怎样获取后台端口数据
    canvas描绘渐变的矩形
    cookie 的增加,销毁,读取
    canvas 绘制图形
    数组的排序,去重复
  • 原文地址:https://www.cnblogs.com/rounie/p/13367545.html
Copyright © 2011-2022 走看看