首页 > 其他分享 >70. 爬楼梯 ----- 动态规划、滚动数组(技巧动态规划)、数学方法:特征方程、矩阵快速幂

70. 爬楼梯 ----- 动态规划、滚动数组(技巧动态规划)、数学方法:特征方程、矩阵快速幂

时间:2022-11-15 13:23:49浏览次数:47  
标签:return int ret vector ----- 台阶 特征方程 动态 public

假设你正在爬楼梯。需要 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

完整动态规划:

class Solution {
    // 动态规划
        // 爬一个台阶有1种方法 1
        //爬两个台阶有2种 1+1,2
        //爬三个台阶有3种 1+1+1,2+1,1+2
        // 爬四个台阶有5种 1+1+1+1,2+1+1,1+2+1,1+1+2,2+2
        //爬五个台阶有8种 1+1+1+1+1,2+1+1+1,1+2+1+1+,1+1+2+1,1+1+1+2,2+2+1,2+1+2,1+2+2
        //爬n个台阶有 (n-1)+(n-2)种    
public:
    int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        vector<int> dp(n+1);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; ++i) {
            dp [i] = dp [i-1] + dp[i -2];
        }
        return dp[n];
    }
};

 

技巧动态规划(滚动数组):

class Solution {
public:
    int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for (int i = 1; i <= n; ++i) {
            p = q; 
            q = r; 
            r = p + q;
        }
        return r;
    }
};

 

特征方程:

class Solution {
public:
    int climbStairs(int n) {
        double sqrt5 = sqrt(5);
        double fibn = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1);
        return (int)round(fibn / sqrt5);
    }
};

矩阵快速幂:

class Solution {
public:
    vector<vector<long long>> multiply(vector<vector<long long>> &a, vector<vector<long long>> &b) {
        vector<vector<long long>> c(2, vector<long long>(2));
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j];
            }
        }
        return c;
    }

    vector<vector<long long>> matrixPow(vector<vector<long long>> a, int n) {
        vector<vector<long long>> ret = {{1, 0}, {0, 1}};
        while (n > 0) {
            if ((n & 1) == 1) {
                ret = multiply(ret, a);
            }
            n >>= 1;
            a = multiply(a, a);
        }
        return ret;
    }

    int climbStairs(int n) {
        vector<vector<long long>> ret = {{1, 1}, {1, 0}};
        vector<vector<long long>> res = matrixPow(ret, n);
        return res[0][0];
    }
};

 

标签:return,int,ret,vector,-----,台阶,特征方程,动态,public
From: https://www.cnblogs.com/slowlydance2me/p/16892098.html

相关文章

  • I2C总线简介-转载
    I2C总线简介-立创社区(szlcsc.com)简介NXP半导体(原Philips半导体)于20多年前发明了一种简单的双向二线制串行通信总线,这个总线这个总线被称为IIC、Inter-IC或者I2C......
  • vue-plugin-Pages自动配置路由
    vite-plugin-pages使用安装首先先安装依赖。因为模版里自带了vue-router,所以不需要再安装。cnpmaddvite-plugin-pagesvite-plugin-vue-layouts-D在vite.config......
  • ACR2022的辩论:DMARDs在pre-RA中的作用
    ACR2022的辩论:DMARDs在pre-RA中的作用2022年11月13日 亚临床RA在风湿病学实践中越来越常见;然而,目前尚不清楚如何管理这些患者,以及启动DMARD是否可以预防RA的发展。 ......
  • 程序人生-Hello’s P2P
        计算机系统 大作业  题    目  程序人生-Hello’sP2P专      业    计算机科学与技术    学  号       20......
  • MAUI新生1.2-XAML语法基础:标记扩展{}
    标记扩展,使属性值可以引用其他源的值或对象,比如引用资源字典、引用其它控件的属性值、绑定ViewModel类属性值等。标记扩展的语法有大括号{}和尖括号<>两种方式,但x:Array比......
  • 深度探讨react-hooks实现原理
    reacthooks实现Hooks解决了什么问题在React的设计哲学中,简单的来说可以用下面这条公式来表示:UI=f(data)等号的左边时UI代表的最终画出来的界面;等号的右边是......
  • CSP 201312-2 ISBN号码 C++
     1#include<iostream>2#include<algorithm>4#include<array>56intmain(){7std::array<int,9>ISBN{};8charc{};9intlenth{......
  • AJAX-基础步骤
          发送AJAX get请求:第一步:创建AJAX核心XMLHttpRequest对象varxhr=newXMLHttpRequest 第二步:注册回调函数;onreadystatechange是一个回调函......
  • 【Javaweb】六-servlet层
    AdminServlet.jap@WebServlet("/AdminServlet")publicclassAdminServletextendsHttpServlet{@Overrideprotectedvoidservice(HttpServletRequestrequ......
  • kube-system命名空间下的serviceAccount和普通命名空间下的serviceaccount权限分析
    kube-system命名空间下的serviceAccount权限下面是摘录自《kubernetes权威指南第5版》中的一段信息。关于kube-system命名空间下,默认的serviceAccount该默认的Service......