刷演算法 我知道的所有類似斐波那契數列的問題

2021-09-13 15:43:18 字數 2393 閱讀 9803

有一類演算法問題類似斐波那契數列,而且解決辦法基本差不多。

不了解斐波那契套路的可以看【刷演算法】斐波那契數列

題目描述

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

分析

設到第n階總共有f(n)種跳法,而且想跳到第n階只有兩種可能,要麼從第n-1階跳一階到達,要麼從第n-2階跳兩階到達,所以遞推式為f(n)=f(n-1)+f(n-2)。特殊情況為,n=0的時候跳法為0;n=1時,跳法為1;n=2時,跳法為2

遞迴

function jump(n)
非遞迴

function jumpfloor(number)

return res;

}

題目描述乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

分析

**的跳台階問題處理起來確實是有些棘手,一次可以跳上的階數是不定的。

先看n=0時,跳法f(0)=0;

n=1,只能是從第0個台階跳過來,跳法f(1)=1;

n=2,可能是第0個台階跳了2階或者從第1個台階跳了1階,跳法f(2)=f(0)+f(1);

n=3,可能是第0個台階跳了3階、第1個台階跳了2階、第2個台階跳了1階,跳法f(3)=f(0)+f(1)+f(2);

...n=n-1,跳法f(n-1)=f(0)+f(1)+f(2)+...+f(n-2);

n=n,跳法f(n)=f(0)+f(1)+f(2)+...+f(n-1);

由上面兩個等式得:f(n) = f(n-1)+f(n-1) = 2f(n-1)

**實現:

function jumpfloorii(number)

題目描述我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

分析

ps:為了方便分析問題,給每個小矩形不同的顏色,其實他們之間沒有差別

假設上圖為用n個21的小矩形無重疊地覆蓋乙個2n的大矩形,方法數為f(n),那麼f(n)可以從哪些情況推導出來呢?

首先很明顯我們知道,2*1的小矩形要麼是橫著放要麼是豎著放,所以f(n)的情況只能由以下兩種情況得來:

這種情況只需要再加乙個豎著的小矩形就可以了,所以這種情況其實是f(n-1)

這種情況下,只需要再加乙個橫著的小矩形就可以了,但是由於這種橫著的小矩形只能成對出現,所以這種情況其實是f(n-2)

綜上,f(n) = f(n-1)+f(n-2)

特殊情況時,f(0)=0,f(1)=1,f(2)=2

**實現

遞迴版

function rectcover(n)

非遞迴版

function rectcover(n)

return res;

}

題目描述假設農場中成熟的母牛每年只會生一頭小母牛,且永遠不會死。第一年農場有1頭成熟的母牛,從第二年開始,母牛開始生小母牛,每只小母牛3年之後成熟又可以生小母牛。給定整數n,求n年後牛的數量。

分析

設f(n)為n年後牛的數量,則第n年牛的**有兩個。

首先,牛是永遠不會死的,所以第n-1的牛都會活到第n年;

其次,還有一部分新生的牛,因為每只小母牛3年之後成熟才可以生小母牛,所以第n-3年的未成熟小母牛到了第n年會成熟且開始生小母牛,所以第n年新生的牛來自於第n-3年的未成熟小母牛和成熟母牛。

綜上,f(n) = f(n-1) + f(n-3)

特殊的,f(1)=1,f(2)=2,f(3)=3

**實現

直接非遞迴版

function cow(n) 

return res;

}

斐波那契演算法

其思想與折半查詢 插值查詢沒有多大區別,本質上只是分割點的選擇不同。斐波那契查詢需要構造斐波那契數列,該數列的作用就是提供分割點 好多演算法書都沒有介紹清楚啊!參閱折半查詢 插值查詢以及斐波那契查詢 1 演算法首先找到構造乙個查詢表,即在原來的陣列上新增元素,使得該查詢表 陣列 的長度為某個斐波那契...

斐波那契查詢演算法

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...

演算法 斐波那契(1)

1.乙隻青蛙一次可以跳上一級台階,也可以跳上二級台階 為了跳上n級台階一共有幾種跳法 解析 1.n 1 1種 2.n 2 2種 3.n級台階可以由n 1或者n 2級台階跳上來f n f n 2 f n 1 include using namespace std int a 100 int jump ...