首页 > 其他分享 >信息学奥赛一本通题目解析:1204:爬楼梯(记忆化递归)

信息学奥赛一本通题目解析:1204:爬楼梯(记忆化递归)

时间:2024-04-04 19:05:29浏览次数:23  
标签:爬楼梯 数组 递归 走法 int 1204 memo 奥赛 楼梯

【题目描述】

树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。

例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。

【输入】

输入包含若干行,每行包含一个正整数N,代表楼梯级数,1≤N≤30。

【输出】

不同的走法数,每一行输入对应一行输出。

【输入样例】

5
8
10

【输出样例】

8
34
89

【解题思路】

记忆化递归(也称作自顶向下的动态规划)通过存储已经计算过的结果来避免重复计算,这样可以显著提高递归解法的效率。在解决树老师爬楼梯问题时,可以用一个数组来保存每一级楼梯对应的走法数,当计算到某一级楼梯的走法时,首先检查这个结果是否已经被计算并存储过了,如果是的话直接返回该结果,否则进行计算,并将计算结果保存供后续使用。

记忆化递归解法思路:

  1. 初始化一个数组用于存储计算过的走法数,数组的大小至少能容纳输入中的最大楼梯数N。由于题目给出的N最大值为30,我们可以安全地初始化一个大小为31的数组(从1开始索引)。

  2. 编写递归函数,该函数接受两个参数:楼梯数n和一个用于存储计算结果的数组memo。函数首先检查memo[n]是否已经有值(非0),如果有,直接返回该值。否则,计算该楼梯数的走法数,并更新memo[n]

  3. 处理基本情况:如果n为1或2,走法数是已知的(分别为1和2),直接返回相应的值并更新memo数组。

  4. 递归计算并返回结果。

【实现代码】

#include <iostream>
using namespace std;

int memo[31] = {0}; // 全局变量数组,用于记忆化递归存储走法数

// 记忆化递归函数,缩写为cs
int cs(int n) {
    if (memo[n] > 0) {
        // 如果已经计算过这个值,直接返回
        return memo[n];
    }
    if (n == 1) {
        memo[n] = 1; // 基本情况
    } else if (n == 2) {
        memo[n] = 2; // 基本情况
    } else {
        // 递归计算
        memo[n] = cs(n - 1) + cs(n - 2); // 移除不必要的模运算
    }
    return memo[n];
}

int main() {
    int N;
    while (cin>>N) {
        cout << cs(N) << endl; // 使用记忆化递归计算并输出结果
    }
    return 0;
}

标签:爬楼梯,数组,递归,走法,int,1204,memo,奥赛,楼梯
From: https://blog.csdn.net/lan_in/article/details/137377684

相关文章

  • 代码随想录算法训练营第38天|理论基础|509. 斐波那契数 |70. 爬楼梯 |746. 使用最小花
    代码随想录算法训练营第38天|理论基础|509.斐波那契数|70.爬楼梯|746.使用最小花费爬楼梯详细布置今天正式开始动态规划!理论基础无论大家之前对动态规划学到什么程度,一定要先看我讲的动态规划理论基础。如果没做过动态规划的题目,看我讲的理论基础,会有感觉是不......
  • 746. 使用最小花费爬楼梯
    746.使用最小花费爬楼梯##题目题解classSolution{publicintminCostClimbingStairs(int[]cost){int[]dp=newint[cost.length+1];dp[0]=0;dp[1]=0;for(inti=2;i<cost.length+1;i++){dp[i]=Math.min(dp[i......
  • (75)爬楼梯
    文章目录1.每日一言2.题目2.1解题思路2.1.1递归2.1.2记忆化搜索2.1.3动态规划2.1.4动态规划空间优化2.2代码2.2.1递归2.2.2记忆化搜索2.2.3动态规划2.2.4动态规划空间优化3.结语1.每日一言Happylifeliesinapeacefulmind.幸福的生活存在于心......
  • LeetCodeHot100 动态规划 70. 爬楼梯 118. 杨辉三角 198. 打家劫舍 279. 完全平方
    70.爬楼梯https://leetcode.cn/problems/climbing-stairs/description/?envType=study-plan-v2&envId=top-100-likedpublicintclimbStairs(intn){if(n<=1)returnn;int[]dp=newint[n+1];dp[1]=1;dp[2]=2;......
  • 初三奥赛模拟测试3
    初三奥赛模拟测试3T1网格图开幕雷击,T1先做2h,糊了个玄学复杂度的做法,会被点叉相交的数据卡,不过数据水,放过去了。考虑正解,枚举正方形可能出现的情况,对于每个正方形,尝试从上一个正方形转移,经过一些预处理,可以做到$O(n)$转移。懒得写正解了,去看其他HZOIers的题解吧T2序......
  • 初三奥赛模拟测试3
    前言我们的\(Shadow\)又\(41\)秒\(AC\)\(T0\)啦!是的又换题了,大多数人都做过,但是我没做过啊\(qwq\)。于是从别的地方扒了\(4\)道题,前两道是\(NOIP\)模拟赛的题,后两道从\(NOI\)模拟赛扒来的,知识点根本不会\(qwq\)。比赛链接T1网络图点击查看题面部......
  • HZOI初三奥赛模拟测试3-T2
    \(HZOI\)初三奥赛模拟测试\(3-T2\)题目描述给定序列\(a_1,a_2,\dotsa_n\),现在可以选择删除一些数,使得删除后\(\sum[a_i=i]\)最大做题历程一下午就做了这一个题,打到最后才发现时间复杂度\(O(\frac{n^2}{2})\)过不去,没时间优化了,最后\(73pts\),赛时最高,好像因为我多剪......
  • 算法训练day50卡玛70. 爬楼梯(进阶版)Leetcode322. 零钱兑换279. 完全平方数
    57.爬楼梯(第八期模拟笔试)题目分析我们可以使用动态规划。动态规划的思想是用一个数组dp来保存到达每一级台阶的方法数。对于每一级台阶i,你可以从i-1,i-2,...,i-m级台阶爬上来(只要这些台阶的索引大于等于0),因此到达第i级台阶的方法数就是这些dp[j](i-m<=j<i)的总和。acm......
  • (45/60)爬楼梯进阶、零钱兑换、完全平方数
    day45爬楼梯进阶卡码网:爬楼梯(第八期模拟笔试)动态规划代码实现/*总和为j总共有dp[j]种方法(可重复选取、排列)dp[j]+=dp[j-nums[i]dp[0]=1;其余为0先背包再物品,正序*/#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){......
  • LCR 088. 使用最小花费爬楼梯
    数组的每个下标作为一个阶梯,第i个阶梯对应着一个非负数的体力花费值cost[i](下标从0开始)。每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为0或1的元素......