洛谷P1255 数楼梯 C++ 思路加代码

题目飞雷神

蒟蒻又来发题解啦!这个题好长时间前就做过了,那时候还是一个连蒟蒻都算不上的vegetable,用的东西都比较基础,某些大佬看了会觉得特别的不堪入目,可确实是我当时"智慧的结晶",然后今天我又做了一下,用了点牛逼的东西,让大佬看了应该会觉得用点东西,不会再被高手们攻击。所以今天的题解,用两种方法写,虽然思路一样就是可以去装一下不会让大佬们不屑。

思路:贼拉简单的高精度,加上斐波那契数列,两个都会做就会觉得非常的水所以说本蒟蒻止会发水题。所以本题的重点就是看出为什么这道题是斐波那契数列,这里有一张图。

我们可以看到啊,第i级台阶的走法数是第i-1级加上第i-2级,原理就是,这一级台阶可以从上一级台阶和上上级台阶达到,也就是上级台阶的走法加上上级台阶的走法的综合,以此类推。是不是看到这儿有点眼熟?其实就是个斐波那契,贼拉简单。不过有一点要注意,n>=5000啊!5000!这东西保守估计也得有几十位,绝对超出了常规计算可以承受的范围,所以是个高精度,还好是加法,不然我的小命就要交呆在这儿了。

代码环节

一:低级方法,适用于初学者去提交,被发现的可能不大,免得被问到的时候出岔子

#include<bits/stdc++.h>
using namespace std;
int a[5003][5003];
int ind=1;
//斐波那契数列函数(简单)
void fib(int m){
	int c=0;
	for(int i=1;i<=ind;i++){
        //套公式
		a[m][i]+=a[m-1][i]+a[m-2][i]+c;
		c=a[m][i]/10;
		a[m][i]=a[m][i]%10;
		if(c>0){
			ind++;
		}
	}
	while(ind>0&&a[m][ind]==0){
		ind--;
	}
}
int main() {
	int n;
	cin >> n;
	a[1][1]=1;
	a[2][1]=2;
    //循环调用
	for(int i=3;i<=n;i++){
		fib(i);
	}
    //输出
	for(int i=ind;i>=1;i--){
		cout << a[n][i];
	}
	return 0;
}

高配版本:适合重刷的时候用来装逼

#include<bits/stdc++.h>
using namespace std;
struct node{
	int ind=0;
	int a[5001]={0};
}dp[5001];
int n;
//运算符重载
node operator +(node x,node y){
	node sum;
	sum.ind=max(x.ind,y.ind);
	for(int i=1;i<=sum.ind;i++){
		sum.a[i]+=x.a[i]+y.a[i];
		if(sum.a[i]>=10){
			sum.a[i+1]+=sum.a[i]/10;
			sum.a[i]%=10;
		}
	}
	if(sum.a[sum.ind+1]){
		sum.ind++;
	}
	return sum;
}
int main(){
	dp[1].ind=1;
	dp[1].a[1]=1;
	dp[2].ind=1;
	dp[2].a[1]=2;
	cin >> n;
	for(int i=3;i<=n;i++){
		dp[i]=dp[i-1]+dp[i-2]; 
	}
	for(int i=dp[n].ind;i>=1;i--){
		cout << dp[n].a[i];
	}
	return 0;
}

最后,点个赞再走呗?=▽=

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值