【C语言】20个阶梯,一次只能走1或2阶,有多少种走法
2020-04-01 19:15
1086 查看
【C语言】20个阶梯,一次只能走1或2阶,有多少种走法。
/* 有20阶阶梯,一次只能上1或2阶阶梯,问有多少种走法的求解 */ /* 分析: 一阶阶梯的时候只有一种走法, 两阶阶梯的时候有两种走法, 三阶的时候,假设第一下跨了两阶,那还剩一阶阶梯,走法数与只有一阶的时候相同; 假设第一下跨了一阶,还剩两阶,走法数与有两阶的时候相同; 那三阶的时候就是两阶的走法数加上一阶时的走法数。 以此类推。 PS:实际上分析过来就是斐波那契数列。 代码实现: 可以有递归与动态规划两种方法。 ------------更新-----------22.12.2019---------- 也可以使用迭代。 x = 1; y = 1; for(.......){ x = x + y; y = x + y; } 递归: 设n阶时走法数为f(n),则f(n) = f(n-1) + f(n-2) 伪代码: int f(int n){ if(1 == n) return 1; if(2 == n) return 2; return f(n - 1) + f(n - 2); } 动态规划: 设n阶时走法为seq[n - 1],则seq[0] = 1;seq[1] = 2; seq = seq[n - 1] + seq[n - 2]; */ #include <stdio.h> #include <stdlib.h> /* 动态规划实现 */ int dpSeq(int n){ int *seq = (int*)malloc(sizeof(int) * n); seq[0] = 1; seq[1] = 2; for (int i = 2; i < n; ++i) seq[i] = seq[i - 1] + seq[i - 2]; int mid = seq[n - 1]; free(seq); return mid; } /* 递归实现 */ int stackSeq(int n){ if(1 == n) return 1; if(2 == n) return 2; return stackSeq(n - 1) + stackSeq(n - 2); } int main(int argc, char const *argv[]) { printf("Stack: %d\n", stackSeq(20)); printf("DP : %d\n", dpSeq(20)); return 0; }
- 点赞 1
- 收藏
- 分享
- 文章举报
相关文章推荐
- 面试题:小明爬楼梯,一次只能上1级或者2级台阶,一共有n级台阶,一共有多少种方法上台阶?python实现
- C语言:【单链表】查找单链表的倒数第k个节点,要求只能遍历一次
- 每个格子只能走有限次 求有多少人可以走出方格 每个人一次最多移动d格
- C语言:【单链表】查找单链表的中间节点,要求只能遍历一次
- 50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 楼梯问题:一次最多跨两个阶梯,有多少种走法
- C语言,将1~9这9个数字分成三组,每组中的三个数排成一个三位的完全平方数,要求每个数字必须且只能用一次
- Codeforces Beta Round #69 (Div. 2 Only) E树型DP 一树,每个结点有虫子,一次只能吃一只,不能停留,问从根结点出发再回到根结点最多能吃多少只虫子
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法
- c语言:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
- c语言:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
- C语言:【单链表】查找单链表的中间节点,要求只能遍历一次
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法【原】
- 一个商人骑一头骆驼去1000公里长的沙漠卖3000根胡萝卜 骆驼一次只能驮1000根胡萝卜 每工里骆驼就得吃一跟胡萝卜 请问那位商人最后能卖多少跟胡萝卜?
- C语言:【单链表】查找单链表的倒数第k个节点,要求只能遍历一次
- 百度面试题01——50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 有n个台阶,如果一次只能上1个或2个台阶,求一共有多少种上法
- 查找单链表的中间节点,要求只能遍历一次链表(C语言)
- C语言实现的一个程序只能运行一次,不能重复运行