遞推演算法(2)

2021-09-29 01:29:47 字數 2501 閱讀 2020

有 2n 的乙個長方形方格,用乙個12 的骨牌鋪滿方格;

編寫乙個程式,試對給出的任意乙個n(n>0), 輸出鋪法總數。

【演算法分析】

(1)當n=1時,

只能是一種鋪法,鋪法總數有示為x1=1。

(2)當n=2時:

骨牌可以兩個並列豎排,也可以並列橫排,再無其他方法,如下左圖所示,因此,鋪法總數表示為x2=2

(3)當n=3時:

4)推出一般規律:對一般的n,要求xn可以這樣來考慮,

若第乙個骨牌是豎排列放置,

剩下有n-1個骨牌需要排列,這時排列方法數為xn-1;

若第乙個骨牌是橫排列,

整個方格至少有2個骨牌是橫排列(1*2骨牌),因此剩下n-2個骨牌需要排列,這是骨牌排列方法數為xn-2。

從第一骨牌排列方法考慮,只有這兩種可能,所以有:

f(n)=f(n-1)+f(n-2) (n>2)

f(1)=1 ;

f(2)=2 ;

**如下:

#include

using

namespace std;

intmain()

}

科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。

每對成蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。

假設每個成蟲不死,第乙個月只有一對成蟲,且卵長成成蟲後的第乙個月不產卵(過x個月產卵).

問過z個月以後,共有成蟲多少對?0=分析:

每個月都有成蟲產卵。

蟲卵經過兩個月才能變成成蟲,產卵。

每個月的成蟲數量是?

由前上個月的成蟲和兩個月之前的蟲卵數量計算

每個月的蟲卵是由i-x個月的成蟲決定(i是當前月份。為什麼不是上個月的成蟲?)

定義陣列f,f[i]表示第i月昆蟲成蟲的數量

新增乙個輔助陣列b,b[i]表示第i月的卵的數目,從而得到兩個公式:

b[i] = f[i - x] * y; (成蟲經過x月產卵 y對)

f[i] = f[i - 1] + b[i - 2]; (卵經過2個月長成成蟲)

**如下:

#include

using

namespace std;

intmain()

,b[101]=

0,i,j,x,y,z;

cin>>x>>y>>z;

for(i=

1;i<=x;i++

)for

(i=x+

1;i<=x+

1;i++

) cout<

<

return0;

}

在所有的n位數中,有多少個數中有偶數個數字3(說明,0是偶數)?

【輸入格式】 讀入乙個數n

【輸出格式】 輸出有多少個數中有偶數個數字3。

【輸入樣例】 2

【輸出樣例】 73(由於 位數 比較大的情況下,導致輸出資料可能越界,因此,輸出個數 % 12345 的結果)

【資料規模】 1<=n<=1000

分析

任何位的數中,根據3的個數不同,分為兩類

或者偶數字的3,或者包含 奇數字的3

1位數中(共10個數)

0,1,2,3,4,5,6,7,8,9,

包含0個3的數有 9個

包含1個3的數有1個

2位數中(90個 10~99)

包含偶數個3的數有 0個3+2個=89+11=72

包含奇數個3的數有 1個3= 9*1

【演算法分析】

前i位有偶數個3,必須滿足以下條件:

前i-1位有偶數個3, 則 第i位不能取3

前i-1位有奇數個3,則第i位必須取3

可以用f[i][0]表示前i位取偶數個3有幾種情況,

f[i][1]表示前i位取奇數個3有幾種情況。

則遞推公式可以表示為:

f[i][0] =f[i-1][0]*9+f[i-1][1]; (9:除3 外的每乙個數)

f[i][1] =f[i-1][0] + f[i-1][1]*9; (9:除3 外的每乙個數字)

邊界條件: f[1][1]=1;f[1][0]=9;

**如下:

#include

using

namespace std;

intmain()

cout<

];return0;

}

演算法筆記2 遞推演算法

演算法特點 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。例1 數字三角形。如下所示為乙個數字三角形。請編乙個程式計算...

遞推演算法二

b align center size medium 遞推演算法二 冪積數列 size align b size medium b 冪積數列 b m 輸入整數n,m求小於n的按從小到大的第m個元素 分析 list b 窮盡法 b 從2開始到n,如果n 2 0,n n 2一直迴圈的直到不能除盡 n 3...

遞推演算法(初學)

遞推演算法 乙個問題的求解需一系列 類似重複 的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係。通過已知條件,利用特定關係得出中間推論,直至得到結果的演算法。在解決問題的時候,去尋找前後過程之間的數學關係 即遞推式 遞推演算法避開了求項公式的麻煩,把乙個複雜的問題的求解,分解成了連續的若干...