首页 > 编程语言 >算法题 - 跳楼梯

算法题 - 跳楼梯

时间:2023-11-17 16:32:33浏览次数:30  
标签:count return int 算法 楼梯 写法 dp

提问:有一道编程题是跳楼梯类型的:有M级楼梯,若每次只能向上跳1级或4级或7级,那么要走上M级,共有多少种写法,请用C语言写出这到题的最优解法,最好用递归来解决,并给每行代码和代码块添加注释

解答:这是一个动态规划问题,我们可以使用递归和备忘录的方法来解决。首先定义一个数组dp,其中dp[i]表示走上i级楼梯的写法数量。然后从1级开始,依次计算到达每一级的写法数量,最后返回dp[M]即可。

#include <stdio.h>

// 定义一个数组用于存储每个阶段的写法数量
int dp[100];

// 递归函数,计算到达第n级的写法数量
int jump(int n) {
    // 如果已经计算过,直接返回结果
    if (dp[n] != -1) {
        return dp[n];
    }

    // 如果n为0或1,说明已经到达顶部,返回1
    if (n == 0 || n == 1) {
        return 1;
    }

    // 初始化当前阶段的写法数量为0
    int count = 0;

    // 遍历所有可能的跳跃步数,累加到达当前阶段的写法数量
    for (int i = 1; i <= 3; i++) {
        if (n - i >= 0) {
            count += jump(n - i);
        }
    }

    // 将当前阶段的写法数量存入数组,并返回结果
    dp[n] = count;
    return count;
}

int main() {
    int M;
    printf("请输入楼梯级数:");
    scanf("%d", &M);

    // 初始化备忘录数组
    for (int i = 0; i <= M; i++) {
        dp[i] = -1;
    }

    // 调用递归函数,计算到达M级的写法数量
    int result = jump(M);
    printf("共有%d种写法
", result);

    return 0;
}

提问:有一道编程题是跳楼梯类型的:有M级楼梯,若每次只能向上跳1级或4级或7级,那么要走上M级,共有多少种写法,请用C语言写出这到题的最优解法,最好用递归来解决,并给每行代码和代码块添加注释,然后将运行后的效果展示出来给我看,然后再用备忘录的解题方法再给我解一遍并输出代码给我

解答:

递归解法:

#include <stdio.h>
// 递归函数,计算跳上M级楼梯的方法数
int jump(int M, int memo[]) {
    // 如果已经计算过,直接返回结果
    if (memo[M] != -1) {
        return memo[M];
    }
    // 如果楼梯只有一级,只有一种方法
    if (M == 1) {
        return 1;
    }
    // 如果楼梯只有两级或三级,有两种方法
    if (M == 2 || M == 3) {
        return 2;
    }
    // 初始化方法数为0
    int count = 0;
    // 遍历所有可能的跳跃步数
    for (int i = 1; i <= 3; i++) {
        // 如果当前跳跃步数小于等于楼梯剩余级数,递归计算剩余级数的方法数
        if (i <= M) {
            count += jump(M - i, memo);
        }
    }
    // 将结果存入备忘录
    memo[M] = count;
    return count;
}

int main() {
    int M;
    printf("请输入楼梯级数:");
    scanf("%d", &M);
    // 初始化备忘录数组
    int memo[M + 1];
    for (int i = 0; i <= M; i++) {
        memo[i] = -1;
    }
    // 调用递归函数,计算跳上M级楼梯的方法数
    int result = jump(M, memo);
    printf("共有%d种写法", result);
    return 0;
}

备忘录解法:

#include <stdio.h>
// 动态规划解法,计算跳上M级楼梯的方法数
int jump_dp(int M) {
    // 初始化备忘录数组
    int memo[M + 1];
    for (int i = 0; i <= M; i++) {
        memo[i] = -1;
    }
    // 初始化基本情况
    memo[1] = 1;
    memo[2] = 2;
    memo[3] = 4;
    // 动态规划求解
    for (int i = 4; i <= M; i++) {
        int count = 0;
        for (int j = 1; j <= 3; j++) {
            if (j <= i) {
                count += memo[i - j];
            }
        }
        memo[i] = count;
    }
    return memo[M];
}
int main() {
    int M;
    printf("请输入楼梯级数:");
    scanf("%d", &M);
    // 调用动态规划解法,计算跳上M级楼梯的方法数
    int result = jump_dp(M);
    printf("共有%d种写法", result);
    return 0;
}

标签:count,return,int,算法,楼梯,写法,dp
From: https://blog.51cto.com/youyeye/8449575

相关文章

  • 基于物理层网络编码的相位同步算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述       基于物理层网络编码的相位同步算法是一种利用物理层网络编码技术来实现相位同步的算法。这种算法的原理是将两个或多个相位不同的信号进行叠加,产生一个叠加信号,然后通过分析叠加......
  • 深度学习算法原理实现——模型欠拟合和过拟合处理
    欠拟合:fromtensorflow.kerasimportregularizersimportnumpyasnpfromtensorflowimportkerasfromtensorflow.kerasimportlayersfromtensorflow.keras.datasetsimportimdbfromtensorflow.keras.datasetsimportmnistdefplot_val_loss_and_acc(model):......
  • 深度学习算法原理实现——线性分类器
     importnumpyasnpimporttensorflowastfimportmatplotlib.pyplotaspltdefmodel(inputs):returntf.matmul(inputs,W)+bdefsquare_loss(targets,predictions):per_sample_losses=tf.square(targets-predictions)returntf.reduce_mean......
  • 深度学习算法原理实现——自写神经网络识别mnist手写数字和训练模型
    代码来自:https://weread.qq.com/web/reader/33f32c90813ab71c6g018fffkd3d322001ad3d9446802347《python深度学习》fromtensorflow.keras.datasetsimportmnistfromtensorflow.kerasimportoptimizersimporttensorflowastfimportnumpyasnpclassNaiveDense:d......
  • 算法学习笔记(1):CDQ分治
    CDQ分治对比普通分治把一种问题划分成不同子问题,递归处理子问题内部的答案,再考虑合并子问题的答案。再看CDQ分治有广泛的应用,但我不会。但在接下来的题目体会到大概:将可能产生的对于答案的贡献分为两类:\(f(l,mid)\)与\(f(mid+1,r)\)内部产生的贡献,其贡献已在递......
  • 字符串哈希算法
    一、字符串哈希:将一串字符串映射成一个整数,并用它来代替字符串进行比较。这样俩个字符串的比较就变成俩个整数的比较,可以将时间复杂度减少至O(1)二、哈希函数:为了将字符串转化为整数,需要一个哈希函数hash,使得以下条件成立:如果字符串s==t那么hash(s)==hash(t)。一般情况下采......
  • 数组类算法题——合并非递减数组
    合并非递减数组题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应......
  • 区间树上查找所有与给定区间相交的区间-算法复杂度正确性证明
    区间树是在平衡树上维护的数据结构,按照左端点大小排序。详见《算法导论》。算法设计思路红黑树的拓展在红黑树上维护结点属性\(min,max\):\(min\)表示该结点及其所有后代结点中的区间低端的最小值。\(max\)表示该结点及其所有后代结点中的区间高端的最大值。在插入时,对结点......
  • Dijkstra算法
    Dijkstra算法1.算法基本介绍Dijkstra算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度O(n2)。Dijkstra算法通常是求解单源最短路中最快的算法,但它无法处理存在负权边的情况(原因在正确性证明中)。Dijkstra本质......
  • 最小生成树(Kruskal和Prim算法)
    最小生成树(Kruskal和Prim算法)部分资料来源于:最小生成树(Kruskal算法)_kruskal算法求最小生成树-CSDN博客、【算法】最小生成树——Prim和Kruskal算法-CSDN博客关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若......