洛谷 【算法1-4】递推与递归 P1255 数楼梯 题解

题目描述
楼梯有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];

}

有任何问题可以再评论区留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值