题目
讲解
大佬讲解:链接
根据题意得这一层楼梯的方案数等于前一层的方案数加上前两层的方案数,即dp[k] = dp[k-1] + dp[k-2]
采用二维数组,方便高精加,将之前一维的数字看作整形数组铺开,就成了二维数组。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5005;
long long n,dp[maxn][maxn];
int len = 1;
int jj(int k){ //高精加
//将前两行数的有数字部分上下相加,len为当前最长的j值
for(int j = 1;j<=len;j++){
dp[k][j] = dp[k-1][j] + dp[k-2][j];
}
//进位
for(int j = 1;j<= len;j++){
if(dp[k][j] > 9){
dp[k][j+1] += dp[k][j] / 10;
dp[k][j] %= 10;
//判断是否len值被更新
if(dp[k][len+1] != 0)
len++;
}
}
}
int main(){
cin>>n;
//数组初始化
dp[1][1] = 1;
dp[2][1] = 2;
//循环相加
for(int i = 3;i<=n;i++){
jj(i);
}
//逆序输出
for(int i = len;i>=1;i--){
cout<<dp[n][i];
}
return 0;
}