计蒜客 爬楼梯问题

问题描述:

假设你现在正在爬楼梯,楼梯有 n 级。每次你只能爬 1 级或者 2 级,那么你有多少种方法爬到楼梯的顶部?

输入格式

第一行输入一个整数 n(1≤n≤50),代表楼梯的级数。

输出格式

输出爬到楼梯顶部的方法总数。

样例输入

5

样例输出

8

C++代码描述

分析:模仿斐波那契数,假设从底走到第n级的走法有f(n)种,走到第n级有两个方法,一个是从(n-1)级走一步,另一个是从第(n-2)级走两步,前者有f(n-1)种方法,后者有f(n-2)种方法,所以有f(n)=f(n-1)+f(n-2),还有f(0)=1,f(1)=1. f(2)=2
具体实现:
方法一重新定义了一个大数,防止越界

#include <iostream>

using namespace std;
typedef long long L;
L a[55];

int main()
{
    int n;
    cin>>n;
    a[0]=0;
    a[1]=1;
    a[2]=2;
    for(int i = 3;i <= n;i++)
    {
        a[i] = a[i-1] + a[i-2];
    }
    cout<< a[n]<<endl;
    return 0;
}

方法二:动态规划
分析:在递归思想的基础下,我们知道存在子问题求解的重复性,运用动规,只需要将子问题求解一次,以后再遇到,直接调用,所以我们新建一个数组用于存储子问题的结果:

#include<iostream>
using namespace std;
int result[100];
int f(int n) {
  int res;
  if(result[n]>0)    //如果大于零,说明该子问题原来已经求过解
    return result[n];   //直接返回对应的数组元素
  if(n==0 || n==1)
    res=1;
  else
    res=f(n-1)+f(n-2);
  result[n]=res;  //每次都将求过解的子问题赋给对应数组元素
  return res;
}
int main() {
  int i, n;
  cin >> n;
  for(i=0;i<=n;i++)
    result[i]=-1;
  cout << f(n);
  return 0;
}

参考博客

猜你喜欢

转载自blog.csdn.net/m0_37592397/article/details/80646060