爬楼梯,计算有多少种方法(1125)

题目描述:

楼梯有n级台阶,上楼可以一步上1级,也可以一步上2级,计算有多少种不同的走法

其中n<=35

输入描述:

一个正整数n,占一行

输出描述:

一个整数,占一行,问题的结果,数据保证输出在32位有符号整型数据范围内。

样例输入:

20

33

样例输出:

10946

5702887

思想:巧妙利用了分治递归的思想,将大数 化为1和2两种情况,1只有一种情况,2有两种情况,设计巧妙。

 1 #include<iostream>
 2 using namespace std;
 3 int fun(int n){
 4     if(n>0){
 5         if(n==1){
 6             return 1;
 7         }
 8         if(n==2){
 9             return 2;
10         }
11         else{
12             return fun(n-1)+fun(n-2);
13         }
14     }
15     else{
16         return 0;
17     }
18 }
19 int main(){
20     int p,m;
21     while(cin>>p){//多组输入
22         m=fun(p);
23         cout<<m<<endl;
24     }
25     return 0;
26 }

原文地址:https://www.cnblogs.com/zq-dmhy/p/11015737.html

时间: 2024-11-08 02:08:45

爬楼梯,计算有多少种方法(1125)的相关文章

有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?

有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?例如:总共3级台阶,可以先迈1级再迈2级,或者先迈2级再迈1级,或者迈3次1级总共3中方式. (2)有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法? (3)一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来.如果所有兔子都不死

Java逐行读取文件有多少种方法?

如果每个线程使用的变量都是其它线程不会读取或修改的,那么就不存在一致性问题.同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题.否则,将会出现不一致性问题.为了解决数据不一致问题,必须引入某些机制使线程间同步. 当变量修改时间多于一个存储器访问周期,同时读.写操作又相互交替时,潜在的不一致性就会出现.如下图所示: 此时,线程B读取到的数据是错误的.使用一把锁能够解决上述问题: 下面介绍线程的三种同步机制: 1.互斥量pthread_mutex_t 互斥量就是锁,对某段临界区进行加锁

UILabel实现上下左右内边距和自适用高度的计算三种方法

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #000000; background-color: rgba(0, 0, 0, 0) } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #000000; background-color: rgba(0, 0, 0

有n级台阶,每次爬1或者2级台阶,用程序计算有多少种爬法

1.递归的方法: private static int Max(int i) { if (i<=2) { return i; } return Max(i-1)+Max(i-2); }

Python实现奖金计算两种方法的比较

应发奖金计算 简述:企业发放的奖金根据利润提成.利润(profit)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到40万之间时,高于20万元的部分,可提成5%: 40万到60万之间时高于40万元的部分,可提成3%: 60万到100万之间时,高于60万元的部分,可提成1.5%, 高于100万元时,超过100万元的部分按1%提成. 提问:从键盘输入当月利润profit,求应发放奖金总数? 01第

动态规划之----我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

利用动态规划,一共有n列,若从左向右放小矩形,有两种放置方式: 第一种:横着放,即占用两列.此时第二行的前两个空格只能横着放,所有,总的放置次数变为1+num(2*(n-2)),其中2*(n-2)代表两行n-2列的矩阵 第二种:竖着放,此时有1+num(2*(n-1)),因此 利用动态规划求解 public class Solution { public int RectCover(int target) { int [] res = new int[target+1]; if(target<=

Tyvj 1730 论我们有多少种方法调戏普通平衡树(其实是备忘录)

题面不用贴了,做过的都知道-- 数组Treap 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 using namespace std; 5 struct node{ 6 int l,r,v,size,rnd,w; 7 }tr[100005]; 8 int n,size,root,ans; 9 void Update(int k) 10 { 11 tr[k].size=tr[tr[k].l].s

动态规划-爬楼梯问题

其实我一直分不清楚动态规划和分治,递归之间的区别与联系...<( ̄3 ̄)> 三者之间应该是有点关系的吧 网上说: 1. 什么是动态规划?         和分治法一样,动态规划(dynamicprogramming)是通过组合子问题而解决整个问题的解.         分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解.         动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.         此时,分治法会做许多不必要的工作,即重复地求

算法分析之爬楼梯问题

一个人每次只能走一层楼梯或者两层楼梯,问走到第n层楼梯一共有多少种方法利用动态规划实现如下: #include <iostream> using namespace std; const int MAX = 100; int result[MAX]; int fib_time(int n) { int res; if (result[n]>0) //若大于零,说明该子问题原来已经求过解 return result[n]; //直接返回对应的数组元素 if (n == 0 || n ==