算法書中的精華(連載中)

本人屯了幾本算法書,打算儘快在大三結束之前汲取完。所以將其中一些有趣的地方記錄下來吧,畢竟算法還是很有趣的,雖然學習的過程中常常伴隨着痛苦

《信息學奧賽一本通》

五種常見的遞推關係

1.Fibonacci數列

斐波那鍥數列是形如這樣的數列:1、1、2、3、5、8、13、21、34、55、89,在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

如比較著名的兔子問題和上臺階問題 都是斐波那鍥數列的應用。想了解更多可以看這裏

2.Hanoi塔問題

問題的提出:Hanoi塔由n個大小不同的圓盤和三根木柱a,b,c組成。開始時,這n個圓盤由大到小依次套在a柱上,如圖3-11所示。
要求把a柱上n個圓盤按下述規則移到c柱上:

這裏寫圖片描述

(1)一次只能移一個圓盤;
  (2)圓盤只能在三個柱上存放;
  (3)在移動過程中,不允許大盤壓小盤。
  問將這n個盤子從a柱移動到c柱上,總計需要移動多少個盤次?

解:設hnh_n爲n個盤子從a柱移到c柱所需移動的盤次。顯然,當n=1時,只需把a 柱上的盤子直接移動到c柱就可以了,故h1h_1=1。當n=2時,先將a柱上面的小盤子移動到b柱上去;然後將大盤子從a柱移到c 柱;最後,將b柱上的小盤子移到c柱上,共記3個盤次,故h2h_2=3。以此類推,當a柱上有n個盤子時,總是先借助c柱把上面的n-1個盤子移動到b柱上,然後把a柱最下面的盤子移動到c柱上;再借助a柱把b柱上的n-1個盤子移動到c柱上;總共移動hn1h_n-1+1+hn1h_n-1個盤次。

hn=2hn1+1h_n=2h_n-1+1 邊界條件:h1=1h_1=1

3.平面分割問題

問題的提出:設有n條封閉曲線畫在平面上,而任何兩條封閉曲線恰好相交於兩點,且任何三條封閉曲線不相交於同一點,問這些封閉曲線把平面分割成的區域個數。

:設an爲n條封閉曲線把平面分割成的區域個數。 由圖3-13可以看出:a2-a1=2;a3-a2=4;a4-a3=6。

這裏寫圖片描述

從這些式子中可以看出anan1=2(n1)a_n-a_{n-1}=2(n-1)。當然,上面的式子只是我們通過觀察4幅圖後得出的結論,它的正確性尚不能保證。下面不妨讓我們來試着證明一下。當平面上已有n-1條曲線將平面分割成an1a_n-1個區域後,第n-1條曲線每與曲線相交一次,就會增加一個區域,因爲平面上已有了n-1條封閉曲線,且第n條曲線與已有的每一條閉曲線恰好相交於兩點,且不會與任兩條曲線交於同一點,故平面上一共增加2(n-1)個區域,加上已有的an1a_n-1個區域,一共有an1+2(n1)a_n-1+2(n-1)個區域。

所以本題的遞推關係是an=an1+2(n1)a_n=a_{n-1}+2(n-1),邊界條件是a1=1a_1=1

4.Catalan數

Catalan數首先是由Euler在精確計算對凸n邊形的不同的對角三角形剖分的個數問題時得到的,它經常出現在組合計數問題中。
問題的提出:在一個凸n邊形中,通過不相交於n邊形內部的對角線,把n邊形拆分成若干三角形,不同的拆分數目用hnh_n表示,hnh_n即爲Catalan數。例如五邊形有如下五種拆分方案(圖3-14),故h5=5h_5=5。求對於一個任意的凸n邊形相應的hnh_n
這裏寫圖片描述

這裏寫圖片描述

Catalan數是比較複雜的遞推關係,尤其在競賽的時候,選手很難在較短的時間裏建立起正確的遞推關係。當然,Catalan數類的問題也可以用搜索的方法來完成,但是,搜索的方法與利用遞推關係的方法比較起來,不僅效率低,編程複雜度也陡然提高。

5、第二類Stirling數

在五類典型的遞推關係中,第二類Stirling是最不爲大家所熟悉的。也正因爲如此,我們有必要先解釋一下什麼是第二類Strling數

【定義2】 n個有區別的球放到m個相同的盒子中,要求無一空盒,其不同的方案數用S(n,m)S(n,m)表示,稱爲第二類Stirling數。
下面就讓我們根據定義來推導帶兩個參數的遞推關係——第二類Stirling數。
解:設有n個不同的球,分別用b1,b2,bnb_1,b_2,……b_n表示。從中取出一個球bnb_nbnb_n的放法有以下兩種:
   ①bnb_n獨自佔一個盒子;那麼剩下的球只能放在m-1個盒子中,方案數爲S(n1,m1)S(n-1,m-1)
   ②bnb_n與別的球共佔一個盒子;那麼可以事先將b1,b2,bn1b_1,b_2,……b_{n-1}這n-1個球放入m個盒子中,然後再將球bnb_n可以放入其中一個盒子中,方案數爲mS(n1,m)m\cdot S(n-1,m)
綜合以上兩種情況,可以得出第二類Stirling數定理:
   S(n,m)=mS(n1,m)+S(n1,m1)(n>1,m>=1)S(n,m)=m\cdot S(n-1,m)+S(n-1,m-1) (n>1,m>=1)
邊界條件可以由定義2推導出:
    S(n,0)=0S(n,1)=1S(n,n)=1S(n,k)=0(k>n)S(n,0)=0;S(n,1)=1;S(n,n)=1;S(n,k)=0(k>n)。
第二類Stirling數在競賽中較少出現,但在競賽中也有一些題目與其類似,甚至更爲複雜。讀者不妨自己來試着建立其中的遞推關係。
小結:通過上面對五種典型的遞推關係建立過程的探討,可知對待遞推類的題目,要具體情況具體分析,通過找到某狀態與其前面狀態的聯繫,建立相應的遞推關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章