题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
走的方式几种。
输入输出样例
输入
4
输出
5
说明/提示
60% N<=50
100% N<=5000)
解题思想
这题洛谷给出的标签是 高精 递推 和 斐波那契
理解题意之后我们来分析题目给出的样例
输入4的时候 有四个阶梯,开以理解为从第0层上到第4层有多少种方法
0 —1 — 2 — 3 — 4
0 —1 — 2 — 4
0 —1 — 3 — 4
0 —2 — 3 — 4
0 —2 — 4
一共五种方法
类似动态规划的数字三角形最优解
你可以发现一个规律
f ( i ) = f ( i - 1 ) = f ( i - 2 ) //也就是斐波拉契
上到第 i 层的方法数 = 上到第 i - 1 层的方法数+上到第 i - 2 层的方法数
到第 i 层可以有第 i -1 层上一层到达,也可由第 i - 2 层上两层到达
如上面例子
上到第1层有1种 0 — 1
上到第2层有2种 0 — 2和 0 — 1 — 2
上到第3层有1 + 2 = 3种
上到第4层有2 + 3 = 5种
当然管理员可不会让你这么容易过,接下来就是实现高精度,用一个二维数组就行了。
代码(c++)
#include<bits/stdc++.h>
using namespace std;
#define maxsize 5001
int main()
{
int n;
int arry[maxsize][maxsize];
cin>>n;
arry[1][0]=1;
arry[2][0]=2;
for(int i=3;i<n+1;i++)
{
for(int j=0;j<maxsize;j++)
{
arry[i][j]=0;
}
}
for(int i=3;i<n+1;i++)
{//进行高精度加法
int j=0;
while(true)
{
arry[i][j]+=arry[i-1][j]+arry[i-2][j];
if(arry[i][j]>9) //进位
{
arry[i][j]-=10;
arry[i][j+1]++;
}
j++;
if(j>=maxsize-1)
break;
}
}
int pd=0;
for(int j=maxsize-1;j>0;j--) //输出 从有往左 从高位到低位 ,遇到第一个不为0的数字之后 将pd置为1 ,以此保证以后再遇到0还可以正常输出
{
if(arry[n][j]!=0)
{
pd=1;
}
if(pd)
cout<<arry[n][j];
}
cout<<arry[n][0];
}
有任何问题可以再评论区留言