洛谷的題目名稱愈來愈瞎叉叉亂寫了ios
原題傳送門程序員
這道題看上去很高大上,但實際上一看(偷偷翻算法書)就知道這是某數列的通項公式(做爲一個OIer,這是基本的數學素養,不懂者......退役吧)。算法
既然知道是斐波那契數列,那麼,脫口而出:F(n)=F(n-1)+F(n-2),那麼恭喜您,退役吧(這就是本蒟蒻的最初想法),爲何不行呢?你們構建一下遞歸樹(棧)就知道了,遞歸層數自己會棧溢出不說,光是時間複雜度,和直接拿題目給的公式模擬的時間複雜度至關了,大約是O(nn),也就是說,您成功的吧O(n)的水題變成了NP徹底問題,那麼正解是什麼呢?優化
其實注意一下題目的分類——遞推,即可知道正解:F[n]=F[n-1]+F[n-2],看上去沒什麼區別對嗎?那麼恭喜您又能夠退役了(非專業人士請走開),這樣直接將時間降爲線性,將空間也降爲線性,可是,這是DP的思想,違背了題目的初衷(雖然已經能AC):遞歸,何況也不是最好的算法,因此——還須要優化。時間已降爲線性,再要減也能夠,但要用斐波那契堆,過於複雜,不展開了(不會),但空間能夠降爲O(1)——運用遞推。spa
很少廢話了,上代碼(真正的程序員跟他講解再多都沒有直接上代碼直觀)。code
#include<iostream> using namespace std; long long a=1,b=1,c=0;///由於n<=48,因此大一點,用long long int n,i; int main() { cin>>n; for (i=3;i<=n;i++) { c=a+b; a=b; b=c; } cout<<c<<".00";///".00"是爲了符合題意....... return 0; }
等我學會斐波那契堆後再來繼續優化吧,時間複雜度應該是能夠降爲O(log2n).遞歸