刚开始使用暴力进行求解,结果发现这是一道考验高精度的题目,后来用高精度的方法,甚至使用到了容器,结果还不如暴力求解的60分,后来看了题解,有一个非常好的思路,即体现了高精度求和,又非常简化了代码;
思路:1、使用二维数组,第一维存储楼梯阶数,第二维存储达到该阶楼梯所有的可能数;对于每一个楼梯阶数,利用高精度加法的方式计算出它对应的结果;
2、这里有个很重要的变量就是len,我一直很迷惑这个变量起到的作用,尤其是刚开始想的非常简单,所求阶数的可能值等于其前两个阶数的和,所以简单来讲只需要进行一次相加,可是len代表的是这个大精度结果的长度,那么它每次相加的次数必然是随着len的增加而增加,非常巧妙,简而言之,就是len代表我们最终所求阶数的元素的输出长度,高位在后面,因为我们是从个位开始,逐步进行相加的,至于在第一步里的循环次数的增加是因为我们在前一轮中产生了进位,所以不仅仅是个位有数值,十位的值也得加上,其余位数同理;
附上代码:
#include<iostream>
#include<string>
using namespace std;
const int N=5e3+10;
int a[N][N];
int n,len=1;
void add(int x){for(int i=1;i<=len;i++){a[x][i]=a[x-1][i]+a[x-2][i];}for(int i=1;i<=len;i++){if(a[x][i]>=10){【a[x][i+1]+=a[x][i]/10;a[x][i]%=10;if(a[x][len+1])len++;}}
}
int main(){cin>>n;a[1][1]=1;a[2][1]=2;for(int i=3;i<=n;i++){add(i);}for(int i=len;i>=1;i--){cout<<a[n][i];}return 0;
}