剛開始使用暴力進行求解,結果發現這是一道考驗高精度的題目,后來用高精度的方法,甚至使用到了容器,結果還不如暴力求解的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;
}