首页 > 其他分享 >动态规划-爬楼梯问题

动态规划-爬楼梯问题

时间:2023-10-17 19:24:38浏览次数:22  
标签:方案 爬楼梯 int 边界条件 台阶 动态 规划 我们

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

 

我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:

f(x)=f(x−1)+f(x−2)

它意味着爬到第 x级台阶的方案数是爬到第x−1级台阶的方案数和爬到第x−2级台阶的方案数的和。

很好理解,因为每次只能爬 1级或 2级,所以 f(x) 只能从 f(x−1) 和 f(x−2)转移过来,而这里要统计方案总数,我们就需要对这两项的贡献求和。

以上是动态规划的转移方程,下面我们来讨论边界条件。我们是从第 0 级开始爬的,所以从第 0 级爬到第 0 级我们可以看作只有一种方案,即 f(0)=1;从第0级到第1级也只有一种方案,即爬一级,f(1)=1。这两个作为边界条件就可以继续向后推导出第 n级的正确结果。我们不妨写几项来验证一下,根据转移方程得到 f(2)=2,f(3)=3,f(4)=5,……,我们把这些情况都枚举出来,发现计算的结果是正确的。

public static 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;
    }

 

 

力扣官方题解链接:https://leetcode.cn/problems/climbing-stairs/

 

标签:方案,爬楼梯,int,边界条件,台阶,动态,规划,我们
From: https://www.cnblogs.com/gentle-man/p/17770454.html

相关文章

  • 递归之斐波那契数列,爬楼梯问题
    什么是递归呢?一个大的问题f(n)可以被拆解为小一点的问题f(n-1)和f(n-2),……直到然后拆到最小的问题f(1)和f(2)。很多人把从大往小算的形式称作递归我们用一个题目引入:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以......
  • 依照教程实现了动态的侧边栏(C#)
    心得说明原来C#的动态效果是通过timer组件的运用实现的(start、stop);真的直接发现了各个组件的属性的重要性,不然真的很难解决问题;这里我觉得吧,先把组件的各个属性搞清楚,那么搭建系统就不会云里雾里了,首先逻辑就会很清晰了~后端具体代码usingSystem;usingSystem.Collections.......
  • 利用反射生成 MyBatisPlus中QueryWrapper动态条件
    问题描述在MyBatisPlus中经常会用到构造复杂查询条件的情况,比如:测试代码@SpringBootTestclassQuery2WrapperTest{@ResourceprivateUserMapperuserMapper;@Testvoidfun(){UserQueryuserQuery=UserQuery.builder().st......
  • vue 动态组件
    动态组件:通过component标签的is属性来进行组件的切换.is的属性值决定要显示的组件:  a.将is的属性值设置为data中的值,以便于动态变化.(1).example:<divid="box"><inputtype="button"@click="test='aaa'"value="aaa组件"><inputtype="......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系
    在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,本篇随笔介绍在WPF应用端中实......
  • fastify-autoload 一个方便的插件动态加载包
    fastify-autoload是一个方便的fastify插件加载工具,我们可以基于路径直接加载开发的插件参考使用配置constFastify=require('fastify')constpath=require("path")constautoLoad=require('@fastify/autoload');constapp=Fastify({logge......
  • 动态内存分配
    0概述通常声明一个数组时需要使用一个常量来指定数组的长度,数组所占用的内存是在编译时就被分配。这种方式的声明的优点是简单,但是存在以下几个缺点:使用的元素数量超过数组声明的长度,当前数组就不能存储相应的数据;如果数组的长度被声明很大,实际使用的元素又比较少会导致内存......
  • 动态IP代理有什么作用?
    随着互联网的普及和发展,越来越多的人开始意识到网络安全和隐私保护的重要性。其中,动态IP代理成为了一种常见的解决方案,被广泛应用于各种场景中。本文将详细介绍动态IP代理的作用。首先,我们需要了解什么是动态IP代理。简单来说,动态IP代理是一种通过代理服务器实现的网络协议转换技术......
  • 动态规划2
    动态规划2P1616疯狂的采药#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e4+5,M=1e7+5;intn,m,w[N],v[N],f[M];signedmain(){ scanf("%lld%lld",&m,&n); for(inti=1;i<=n;i++) scanf("%lld%lld"......
  • 基于X86六轮差速移动机器人运动控制器设计与实现(二)规划控制算法
    带输入约束的MPC路径跟踪控制MPC算法是一种基于控制对象模型的控制方法,其优势在于在控制中考虑了系统的多种物理约束,同时基于模型与当前机器人的反馈信息预估出未来机器人位姿信息的处理方法可以解决控制迟滞的问题。4.1MPC路径跟踪控制器框架根据第......