1. 程式人生 > >五種典型的遞推關係——一步一步演算法篇

五種典型的遞推關係——一步一步演算法篇

五種典型的遞推關係

1.Fibonacci數列

所有的遞推關係中,Fibonacci數列應該是最為大家所熟悉的。在最基礎的程式設計語言Logo語言中,就有很多這類的題目。而在較為複雜的Basic、Pascal、C語言中,Fibonacci數列類的題目因為解法相對容易一些,逐漸退出了競賽的舞臺。可是這不等於說Fibonacci數列沒有研究價值,恰恰相反,一些此類的題目還是能給我們一定的啟發的。
Fibonacci數列的代表問題是由義大利著名數學家Fibonacci於1202年提出的“兔子繁殖問題”(又稱“Fibonacci問題”)。
問題的提出:有雌雄一對兔子,假定過兩個月便可繁殖雌雄各一的一對小兔子。問過n個月後共有多少對兔子?
  

:設滿x個月共有兔子Fx對,其中當月新生的兔子數目為Nx對。第x-1個月留下的兔子數目設為Fx-1對。則:
Fx=Nx+ Fx-1
   Nx=Fx-2 (即第x-2個月的所有兔子到第x個月都有繁殖能力)
   ∴ Fx=Fx-1+Fx-2 邊界條件:F0=0,F1=1
由上面的遞推關係可依次得到:
   F2=F1+F0=1,F3=F2+F1=2,F4=F3+F2=3,F5=F4+F3=5,……。
Fabonacci數列常出現在比較簡單的組合計數問題中,例如以前的競賽中出現的“骨牌覆蓋”問題。在優選法中,Fibonacci數列的用處也得到了較好的體現。

2.Hanoi塔問題

問題的提出:Hanoi塔由n個大小不同的圓盤和三根木柱a,b,c組成。開始時,這n個圓盤由大到小依次套在a柱上,如圖3-11所示。
要求把a柱上n個圓盤按下述規則移到c柱上:
這裡寫圖片描述
  (1)一次只能移一個圓盤;
  (2)圓盤只能在三個柱上存放;
  (3)在移動過程中,不允許大盤壓小盤。
  問將這n個盤子從a柱移動到c柱上,總計需要移動多少個盤次?
  
:設hn為n個盤子從a柱移到c柱所需移動的盤次。顯然,當n=1時,只需把a 柱上的盤子直接移動到c柱就可以了,故h1=1。當n=2時,先將a柱上面的小盤子移動到b柱上去;然後將大盤子從a柱移到c 柱;最後,將b柱上的小盤子移到c柱上,共記3個盤次,故h2=3。以此類推,當a柱上有n(n2)個盤子時,總是先借助c柱把上面的n-1個盤子移動到b柱上,然後把a柱最下面的盤子移動到c柱上;再借助a柱把b柱上的n-1個盤子移動到c柱上;總共移動hn-1+1+hn-1個盤次。
   ∴hn=2hn-1+1 邊界條件:h1=1

3.平面分割問題

問題的提出:設有n條封閉曲線畫在平面上,而任何兩條封閉曲線恰好相交於兩點,且任何三條封閉曲線不相交於同一點,問這些封閉曲線把平面分割成的區域個數。
:設an為n條封閉曲線把平面分割成的區域個數。 由圖3-13可以看出:a2-a1=2;a3-a2=4;a4-a3=6。
這裡寫圖片描述
這些式子中可以看出an-an-1=2(n-1)。當然,上面的式子只是我們通過觀察4幅圖後得出的結論,它的正確性尚不能保證。下面不妨讓我們來試著證明一下。當平面上已有n-1條曲線將平面分割成an-1個區域後,第n-1條曲線每與曲線相交一次,就會增加一個區域,因為平面上已有了n-1條封閉曲線,且第n條曲線與已有的每一條閉曲線恰好相交於兩點,且不會與任兩條曲線交於同一點,故平面上一共增加2(n-1)個區域,加上已有的an-1個區域,一共有an-1+2(n-1)個區域。所以本題的遞推關係是an=an-1+2(n-1),邊界條件是a1=1。
平面分割問題是競賽中經常觸及到的一類問題,由於其靈活多變,常常感到棘手,下面的例8是另一種平面分割問題,有興趣的讀者不妨自己先試著求一下其中的遞推關係。

4.Catalan數

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

這裡寫圖片描述

這裡寫圖片描述

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

第二類Stirling數

五類典型的遞推關係中,第二類Stirling是最不為大家所熟悉的。也正因為如此,我們有必要先解釋一下什麼是第二類Strling數。
**【定義2】**n個有區別的球放到m個相同的盒子中,要求無一空盒,其不同的方案數用S(n,m)表示,稱為第二類Stirling數。
下面就讓我們根據定義來推導帶兩個引數的遞推關係——第二類Stirling數。
:設有n個不同的球,分別用b1,b2,……bn表示。從中取出一個球bn,bn的放法有以下兩種:
   ①bn獨自佔一個盒子;那麼剩下的球只能放在m-1個盒子中,方案數為S2(n-1,m-1);
   ②bn與別的球共佔一個盒子;那麼可以事先將b1,b2,……bn-1這n-1個球放入m個盒子中,然後再將球bn可以放入其中一個盒子中,方案數為mS2(n-1,m)。
綜合以上兩種情況,可以得出第二類Stirling數定理:
    【定理】S2(n,m)=mS2(n-1,m)+S2(n-1,m-1) (n>1,m1)
邊界條件可以由定義2推匯出:
    S2(n,0)=0;S2(n,1)=1;S2(n,n)=1;S2(n,k)=0(k>n)
第二類Stirling數在競賽中較少出現,但在競賽中也有一些題目與其類似,甚至更為複雜。讀者不妨自己來試著建立其中的遞推關係。

小結:通過上面對五種典型的遞推關係建立過程的探討,可知對待遞推類的題目,要具體情況具體分析,通過找到某狀態與其前面狀態的聯絡,建立相應的遞推關係。

一步一步演算法篇

相關推薦

典型關係——演算法

五種典型的遞推關係 1.Fibonacci數列 在所有的遞推關係中,Fibonacci數列應該是最為大家所熟悉的。在最基礎的程式設計語言Logo語言中,就有很多這類的題目。而在較為複雜的Basic、Pascal、C語言中,Fibonacci數列類的題

【POJ1958】【典型問題】漢諾塔問題

題意:       給你n個盤子,問在四個柱子的情況下,最少需要多少步才能將n個盤子移動到另一個柱子上。   思路:       先來看看最經典的三個柱子問題。       f3[

典型開發週期模型(瀑布、V、原型化、螺旋、迭代)

    總結一下經常可以見到的系統開發週期模型。    在過去的幾年裡,可以很奇葩的碰到類似於“創業專案庫”這種需求非常明確,工作量十分可控,對質量要求比較低,業務建模比較easy,功能構成比較少的“面子專案”。類似於這種專案,採用傳統意義上的瀑布模型就非常合適了,如果範圍控制和風險控制做的比較好的話,真的如

軟體工程典型的開發模型各自特點----阿冬專欄

轉自:http://www.cnblogs.com/kzloser/archive/2012/07/06/2578835.html 瀑布模型 1.里程碑或基線驅動。2.過程逆轉性很差或者說不可逆轉。逆轉可能會延誤工期,增加成本,造成損失   1.開發階段清晰,便

總結一下實現網路爬蟲的方法(,基於socket通訊編寫爬蟲)

最近呢,由於實習需要呢,複習一遍爬蟲,前斷時間閉關刷題去了,也會把刷題心得總結成部落格分享給大家,比如java集合類特性及原始碼解析,作業系統資料結構的一些演算法,設計模式等,放心,肯定不會鴿的,雖然可能會晚一點寫。言歸正傳,java實現網路爬蟲一般有五種方法(據我所知,要是

矩陣快速冪在常係數線性關係中的應用

先引入一下,知乎上有一個問題 關於斐波拉契數列的一個低階問題 。題主詢問了關於求解斐波拉契數列第n項對10007取模的結果。而這個n,可以達到106甚至109 。 解法已經在排名第一的回答中給出了,主要思路就是快速冪和矩陣乘法的結合律,亦即矩陣快速冪。具體方法

演算法】幾個經典關係記錄

遞推關係數學味很重(貌似很多都是直接有公式的),不過很多記憶搜尋或者dp的狀態轉移都是要自己推理的,記錄幾個俗爆炸的遞推關係... 文科生學計算機......我呵呵一臉 :( Fibonacci 這個很常見,第一次刷題愣是沒找出來...覺得特難(文科生的悲哀)! 目前

hdu step 3 1 1 超級樓梯 簡單 從第1級到第m級有多少走法 每次只能走或兩

                在寫題解之前給自己打一下廣告哈~。。抱歉了,希望大家多多支援我在CSDN的視訊課程,地址如下:http://edu.csdn.net/course/detail/209題目:超級樓梯Time Limit: 2000/1000 MS (Java/Others) Memory Li

組合數字首和的Trick

記錄一下一種推組合數字首和的方法 ## Trick 設$\sum_{i = 0}^m C_n^i = S(n, m)$ $S$是可以遞推的 - $S(n, m + 1) = S(n, m) + C_{n}^{m + 1}$ 就是加上最末尾的一項 - $S(n + 1, m)

51nod 1361 有階二次式)

矩陣 個數 bubuko 二次 技術 有一種 這就是 mage 9.png 分析:- - 這就是個數學競賽題啊...遞推式可以這麽求: tn可以用矩陣快速冪求出來,然後用最後一個式子求一下bn再代回去求an就行了。p^2-1不一定是最小周期,但一定是一個周期。51

c語言中典型的排列組合算法

scan .com nbsp 方法 can main else const 組合數 c語言中的全排列算法和組合數算法在實際問題中應用非常之廣,但算法有許許多多,而我個人認為方法不必記太多,最好只記熟一種即可,一招鮮亦可吃遍天 全排列: #include<stdio.h

由DAG到背包問題——記憶化搜索和解法

必須 結果 stream size 遞推 algo main style 得到 一、問題描述 物品無限的背包問題:有n種物品,每種均有無窮多個。第 i 種物品的體積為Vi,重量為Wi。選一些物品裝到一個容量為 C 的背包中,求使得背包內物品總體積不超過C的前提下重量的最大值

[ 9.26 ]CF每日題系列—— 771B問題

std ret 重名 () while 字數 har rip ace Description:   給定你命名的規律,1-10個字符,開頭必須大寫,最多有50個名字,然後告訴你有n個人,判斷區間長度為k,那麽你將得到n - k + 1個答案(YES or NO) 表示1 -

[神經網絡]使用Mobile-Net完成視覺識別(

arc del img fault model coord graph 處理 mobile 1.環境配置 2.數據集獲取 3.訓練集獲取 4.訓練 5.調用測試訓練結果 6.代碼講解   本文是第五篇,講解如何調用測試訓練結果。 上一篇中我們輸出了訓練的模型,這一篇中我們通

隻小蜜蜂(hdoj 2044,動態規劃)

Problem Description 有一隻經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請程式設計計算蜜蜂從蜂房a爬到蜂房b的可能路線數。 其中,蜂房的結構如下所示。 Input 輸入資料的第一行是一個整數N,表示測試例項的個數,然後是N 行資料,每行包含兩個整

型別的程式設計師,你屬於哪

在我的程式設計生涯中,我碰到過很多奇奇怪怪的對手和同盟。我把這些編碼戰士們分成五類,有些人是你隊伍中的好夥伴,有些人則是搗蛋者,讓你的每一個計劃都完不成。 不管怎麼說,他們在軟體開發的諸神殿上都佔有一席之地。如果你的團隊中沒有一個合適健康的比例,混合這些不同型別的程式設計師,要麼你會發現你的專案跌跌

《C++ Primer Plus》學習筆記——第章 迴圈和關係表示式(

本章內容: for迴圈和while迴圈 表示式和語句 運算子組合 複合語句 逗號運算子以及關係運算符 typedef工具 字元輸入方法get() 檔案尾條件 巢狀迴圈和二維陣列 計算機除了儲存資料外,還可以做很多其他工作。可以對資料進

矩陣快速冪(共軛函式兩式)

題目連結:https://cn.vjudge.net/contest/261339#problem/B AC1:ans= x(n)+y(n)*sqrt(6),所以,ans=x(n)+y(n)*sqrt(6)+(x(n)-y(n)*sqrt(6))-(x(n)-y(n)*sqrt(6))=2*

Redis學習筆記()---Redis的資料型別的簡單介紹和使用

1.準備工作:     1.1在Linux下安裝Redis    https://www.cnblogs.com/dddyyy/p/9763098.html    1.2啟動Redis     先把root/redis的redis.conf放到 /usr/local/redis/

JPA 對映關係

一、JPA_對映單向多對一的關聯關係 1、建立實體類 //訂單 @Table(name="JPA_ORDER") @Entity public class Order { private Integer id; private String orderName; priva