日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法之递推及其应用(递推关系的建立及在信息学竞赛中的应用 安徽 高寒蕊)...

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法之递推及其应用(递推关系的建立及在信息学竞赛中的应用 安徽 高寒蕊)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義:給定一個數的序列H0,H1,…,Hn,…若存在整數n0,使當nn0時,可以用等號(或大于號、小于號)將Hn與其前面的某些項Hn(0i<n)聯系起來,這樣的式子就叫做遞推關系。

遞推關系中存在著三大基本問題:如何建立遞推關系,已給的遞推關系有何性質,以及如何求解遞推關系。

五種基本的遞推關系:

Ⅰ.Fibonacci數列?

在所有的遞推關系中,Fibonacci數列應該是最為大家所熟悉的。在最基礎的程序設計語言Logo語言中,就有很多這類的題目。而在較為復雜的Basic、PascalC語言中,Fibonacci數列類的題目因為解法相對容易一些,逐漸退出了競賽的舞臺。可是這不等于說Fibonacci數列沒有研究價值,恰恰相反,一些此類的題目還是能給我們一定的啟發的。

Fibonacci數列的代表問題是由意大利著名數學家Fibonacci于1202年提出的“兔子繁殖問題”(又稱“Fibonacci問題”)

問題的提出:有雌雄一對兔子,假定過兩個月便可繁殖雌雄各一的一對小兔子。問過n個月后共有多少對兔子?

解:設滿x個月共有兔子Fx對,其中當月新生的兔子數目為Nx對。第x-1個月留下的兔子數目設為Ox對。則:

?????Fx=Nx+Ox

而???Ox=Fx-1,

Nx=Ox-1=Fx-2?(即第x-2個月的所有兔子到第x個月都有繁殖能力了)

?∴???Fx=Fx-1+Fx-2????? 邊界條件:???F0=0,F1=1

?

由上面的遞推關系可依次得到

F2=F1+F0=1F3=F2+F1=2,F4=F3+F2=3F5=F4+F3=5,……。

Fabonacci數列常出現在比較簡單的組合計數問題中,例如以前的競賽中出現的“骨牌覆蓋”[1]問題、下文中的『例題1』等都可以用這種方法來解決。在優選法[2]中,Fibonacci數列的用處也得到了較好的體現。

?

Ⅱ.Hanoi塔問題

問題的提出:Hanoi塔由n個大小不同的圓盤和三根木柱a,b,c組成。開始時,這n個圓盤由大到小依次套在a柱上,如圖1所示。

?
??

要求把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????邊界條件:hn-1=1

?

Ⅲ.平面分割問題

問題的提出:

?
??

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

解:設an為n條封閉曲線把平面分割成的區域個數。?由圖2可以看出: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。

平面分割問題是競賽中經常觸及到的一類問題,由于其靈活多變,常常讓選手感到棘手,下文中的『例題2』是另一種平面分割問題,有興趣的讀者不妨自己先試著求一下其中的遞推關系。

?

Ⅳ.Catalan數

Catalan數首先是由Euler在精確計算對凸n邊形的不同的對角三角形剖分的個數問題時得到的,它經常出現在組合計數問題中。

問題的提出:在一個凸n邊形中,通過不相交于n邊形內部的對角線,把n邊形拆分成若干三角形,不同的拆分數目用hn表之,hn即為Catalan數。例如五邊形有如下五種拆分方案(圖6-4),故h5=5。求對于一個任意的凸n邊形相應的hn。

?
??

  

解:設Cn表示凸n邊形的拆分方案總數。由題目中的要求可知一個凸n邊形的任意一條邊都必然是一個三角形的一條邊,邊P1?Pn也不例外,再根據“不在同一直線上的三點可以確定一個三角形”,只要在P2,P3,……,Pn-1點中找一個點Pk(1<k<n),與P1、Pn?共同構成一個三角形的三個頂點,就將n邊形分成了三個不相交的部分(如圖3所示),我們分別稱之為區域①、區域②、區域③,其中區域③必定是一個三角形,區域①是一個凸k邊形,區域②是一個凸n-k+1邊形,區域①的拆分方案總數是Ck,區域②的拆分方案數為Cn-k+1,故包含△P1PkPn的n?邊形的拆分方案數為CkCn-k+1種,而Pk可以是P2,P3,……,Pn-1種任一點,根據加法原理,凸n邊形的三角拆分方案總數為,同時考慮到計算的方便,約定邊界條件C2=1。

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

?

Ⅴ.第二類Stirling數

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

【定義2n個有區別的球放到m個相同的盒子中,要求無一空盒,其不同的方案數用S(n,m)表示,稱為第二類Stirling數。

下面就讓我們根據定義3來推導帶兩個參數的遞推關系——第二類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(1998蚌埠市競賽復試第一題)有一只經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。試求出蜜蜂從蜂房a爬到蜂房b的可能路線數。

解:這是一道很典型的Fibonacci數列類題目,其中的遞推關系很明顯。由于“蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行”的限制,決定了蜜蜂到b點的路徑只能是從b-1點或b-2點到達的,故fn=fn-1+fn-2?(a+2nb),邊界條件fa=1,fa+1=1。(附有程序Pro_1.Pas)

?

『例2(1998合肥市競賽復試第二題)同一平面內的n(n500)條直線,已知有p(p2)條直線相交于同一點,則這n條直線最多能將平面分割成多少個不同的區域?

解:這道題目與第一部分中的平面分割問題十分相似,不同之處就在于線條的曲直以及是否存在共點線條。由于共點直線的特殊性,我們決定先考慮p條相交于一點的直線,然后再考慮剩下的n-p條直線。首先可以直接求出p條相交于一點的直線將平面劃分成的區域數為2p個,然后在平面上已經有k(kp)條直線的基礎上,加上一條直線,最多可以與k條直線相交,而每次相交都會增加一個區域,與最后一條直線相交后,由于直線可以無限延伸,還會再增加一個區域。所以fm=fm-1+m?(m>p),邊界條件在前面已經計算過了,是fp=2p。雖然這題看上去有兩個參數,但是在實際做題中會發現,本題還是屬于帶一個參數的遞推關系。(附有程序Pro_2.Pas)

上面的兩道例題之中的遞推關系比較明顯,說它們屬于的遞推關系類的試題,相信沒有人會質疑。

下面再讓我們來看另一道題目。

?
??

『例3(1999江蘇省組隊選拔賽試題第二題)在一個n×m的方格中,m為奇數,放置有n×m個數,如圖7

?
??

方格中間的下方有一人,此人可按照五個方向前進但不能越出方格。如圖8所示:

人每走過一個方格必須取此方格中的數。要求找到一條從底到頂的路徑,使其數相加之和為最大。輸出和的最大值。

解:這題在本質上類似于第一題,都是從一個點可以到達的點計算出可以到達一個點的所有可能點,然后從中發掘它們的關系。我們用坐標(x,y)唯一確定一個點,其中(m,n)表示圖的右上角,而人的出發點是,受人前進方向的限制,能直接到達點(x,y)的點只有(x+2,y-1),(x+1,y-1),(x,y-1),(x-1,y-1),(x-2,y-1)。到點(x,y)的路徑中和最大的路徑必然要從到(x+2,y-1),(x+1,y-1),(x,y-1),(x-1,y-1),(x-2,y-1)的幾條路徑中產生,既然要求最優方案,當然要挑一條和最大的路徑,關系式如下:Fx,y=?Max{Fx+2,y-1?,Fx+1,y-1,Fx,y-1,Fx-1,y-1,Fx-2,y-1}+Numx,y,其中Numx,y表示(x,y)?點上的數字。邊界條件為:,。(附有程序Pro_3.Pas)

看到上面的題目,肯定有人會說,這不是遞推關系的應用,這是動態規劃;上面的關系式也不是遞推關系,而是動態轉移方程。為什么呢?因為關系式中有取最大值運算(Max),所以它屬于動態規劃。是嗎?遞推關系的定義中只要求“用等號(或大于號、小于號)將H(n)與其前面的某些項H(i)(0i<n)聯系起來”,聯系的含義很廣,當然也包括用取最大(小)值運算符聯系起來。所以我們認為,上面的題目仍可屬于遞推關系,當然,同時它也屬于動態規劃。那么遞推關系與動態規劃之間到底是什么關系呢?我們不妨畫個Venn(見圖9)。如果用數學式子表示,就是:A={遞推關系}B={動態規劃}BA。通常人們理解的遞推關系就是一般遞推關系,故認為動態規劃與遞推關系是兩個各自獨立的個體。下面讓我們通過列表來分析一般遞推關系與動態規劃之間的異同(見表1)

?
??

?

?

盡管一般遞推關系與動態規劃之間存在著這樣和那樣的區別,但是在實際運用中,人們還是經常把它們混為一談,而且總是把一般遞推關系誤認為是動態規劃。這是因為從上個世紀五六十年代開始被人們發現的動態規劃曾在信息學競賽中掀起了一陣巨浪,直到今天,它仍是信息學競賽中的重頭戲。但是,遞推關系的歷史源遠流長,雖然一般遞推關系在今天不如動態規劃那么炙手可熱,但是它對人的影響是不可忽視的。在IOI’99的選拔賽中,就出現過一道《01統計》[4],很多人只是先利用公式求組合數,再對組合數求和,來求A類數的個數,導致程序效率不高,其實,這是一道非常典型的遞推關系類題目[5],由于選手平時對一般遞推關系的忽視,導致賽場失利。

還有一類博弈問題也利用了遞推關系,讓我們來看一道關于這方面的例題。

『例4(1995《學生計算機世界》)寫一個計算機程序,讓計算機和人玩紙牌游戲,爭取計算機獲勝,并顯示整個游戲過程。該游戲是:兩個選手(計算機一方,人為另一方)比賽:有n張(3<n<10000)紙牌,兩個選手交替地拿取(計算機先拿),誰取走最后一張即誰勝。拿取規則為:第一個選手拿走1n-1張牌(可拿任意張,但不能拿完);以后,每個人可取1張或1張以上,但不得取走大于對方剛取數目的2(設對方剛取走b張,則可取12b張)。

解:這到題目看上去是一道很明顯的動態規劃試題,以剩余牌數劃分階段,狀態Fp,k表示剩余p張牌,且第一人最多可以取k張牌的情況是必敗點還是必贏點。

狀態轉移方程是:Fp,k=(pk)??or??Fp,k-1??or??not??Fp-k,2k??(1pn,1k<n)

然后我們可以根據求出的各個狀態的情況設計一種取牌方案,使計算機穩贏,當然,如果初始牌數是必敗點,那么計算機只能認輸。

在牌數不太多的情況下,這種方法效率比較高,但是一旦牌數很大(假設n達到極限),那么需要的空間是O(105105),必然會導致空間不夠的問題,這種方法就不可行。

我們不妨把牌數較小的狀態畫成表來觀察(見表2),看其中是否存在什么規律。

通過表2可以很明顯的看出,如果剩余牌數為2358張的話,無論先取牌的選手取多少張牌(假定不能夠一次取完所有的牌),都必然會輸(除非另一個選手不想贏);像2358這類數字,我們稱之為“必敗牌數”。在初始牌數不是必敗牌數的情況下,我們要設計一種方案,使每次計算機取過x張牌后,剩余的紙牌數大于2x張,且為必敗牌數。那么究竟那些數字是必敗牌數呢?從表中的數字2358我們猜測Fibonacci數列中從2開始的數字都是必敗牌數,并通過數學證明得證[6]。那么我們就可以根據求出的必敗牌數設計方案了。如果想讓計算機在每一次取走x張牌后剩下的牌數是必敗牌數,且大于2x張,看來是辦不到。例如,初始牌數20張,如果一次取走7張,使剩余13張的話,對手可以一次性將13張牌全部取走。那么我們只有再對7張牌設計一種方案,保證計算機能取到第7張牌,并且計算機最后一次取的牌數小于13/2張就可以了,而實現這一步這只需嵌套利用次Fibonacci數列就可以了(附有程序Pro_4.Pas)

小結:從上面的例題中可以看出,利用一般遞推關系解題有時會比動態規劃更簡單,在動態規劃實現起來比較困難的情況下,一般遞推關系可能會產生重要作用,這種作用往往表現在直接求解或簡化動態規劃過程兩方面。

?

總結

通過上文對遞推關系的建立和在信息學競賽中的應用的具體闡述,可知,遞推關系不是一種抽象的概念,它是具體的,是需要針對具體題目而言的,因此,我們無法找出一種方法建立出所有的遞推關系,只能根據需要解決的題目的具體條件來分析。雖然遞推關系的建立沒有一個固定的模式可循,但是從總體上來說,都要先找出題目中的重要條件,在這基礎上分析某一項與其前面的若干項的關系,然后找出邊界條件。遞推關系在競賽中的應用相當的廣泛,它包含了幾乎每賽必考的動態規劃,所以學好遞推關系的建立,無論是對提高我們的數學素質,還是今后的競賽,都大有裨益。因為動態規劃更為大家所熟悉,所以本文著重說明了遞推關系中的一般遞推關系,希望能給選手一定的啟發。

?

【附??錄】

骨牌覆蓋:2×n的棋盤用1×2的骨牌作完全覆蓋,求不同的覆蓋方式數Cn

優選法:設函數y=fx在區間(a,b)上有一單峰極值點,假定為極大點。所謂單峰極值,即只有一個極點ξ,而且當x與ξ偏離越大,偏差|f(x)-f(ξ)|也越大。要求用若干次試驗找到ξ點準確到一定的程度。較優的是實驗方法有0.618優選法和Fibonacci優選法。

組合公式的證明:

∴??證畢。

01序列:近來IOI的專家們在進行一項有關二進制數的研究,研究設計的一個統計問題令他們大傷腦筋。問題是這樣的:對于一個自然數n,可以把他轉換成對應的二進制數,其中:n=ak2k+ak-12k-1+……a121+a0;而且ai=0或1(0i<k),ak=1。如:10=10105=101。我們統計一下a0~ak,這k+1個數中0的個數和1的個數。如果在這k+1個數中,0的個數比1的個數多,就稱為A類數。現在的任務是,對于一個給定的m,求1~ma類數的個數。

有關于《01統計》的解法可參見徐靜同學的解題報告。

證明:用數學歸納法證明:

由表2?可以得知:Fibonacci數235、是必敗牌數,且在(1,5)之間的其他牌數都是必贏牌數

假設Fibonacci數列F1,F2……Fi,Fi+1滿足在(F1,Fi+1]區間,只有Fibonacci數才是必敗牌數,且其他牌數都是必贏牌數。則我們可證明在(F1,Fi+2]區間的牌數也滿足上面的性質。證明如下:

????設剩下Fi+2張牌,設這一次,計算機取了x張牌,則剩下牌數為p=Fi+2-x張

xFi,則pFi+1,

?∵Fi=Fi+Fi-1且Fi-1Fi

?∴Fi+12Fi

?∴p2x

?∴人可以一次將剩下的p張牌全部取完

?∴計算機一定會輸

若1x<Fi,則p>Fi+1

?∵Fi+2-Fi=Fi+1Fi+1Fibonacci數

?∴計算機無法通過一種取牌方案,使計算機在某一次取過少于Fi+1/2張牌后,剩下Fi+1張牌

?∴當剩下Fi+1張牌的時候,必然輪到計算機取,且計算機這時不能一次將所有牌取完

?∵Fi+1Fibonacci數

?∴計算機一定會輸

??又∵p(Fi+1,Fi+2),即剩下p張牌輪到人取的時候,人一定獲勝,

?∴p是必贏牌數

12可得結論成立。?證畢。

轉載于:https://www.cnblogs.com/PegasusWang/archive/2013/01/20/2868776.html

總結

以上是生活随笔為你收集整理的算法之递推及其应用(递推关系的建立及在信息学竞赛中的应用 安徽 高寒蕊)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。