【遞推】月落烏啼算錢

洛谷的題目名稱愈來愈瞎叉叉亂寫了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

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).遞歸

相關文章
相關標籤/搜索