蒟蒻又来发题解啦!这个题好长时间前就做过了,那时候还是一个连蒟蒻都算不上的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;
}
最后,点个赞再走呗?=▽=