日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

編程之美 買票找零 寫的太贊了!

系統(tǒng) 2081 0

本文上半部分來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處: http://blog.csdn.net/jeiwt/archive/2010/01/30/5272541.aspx

下半部分轉(zhuǎn)載自 http://yishan.cc/blogs/gpww/archive/2009/10/08/2-1-catalan.aspx


題目描述:

假設(shè)有2N個(gè)人在排隊(duì)買票,其中有N個(gè)人手持50元的鈔票,另外有N個(gè)人手持100元的鈔票,假設(shè)開始售票時(shí),售票處沒有零錢,問這2N個(gè)人有多少種排隊(duì)方式,不至使售票處出現(xiàn)找不開錢的局面?

題目分析:

這題時(shí)典型的卡特蘭數(shù)(Cartalan)問題


最典型的四類應(yīng)用(實(shí)質(zhì)上卻都一樣,無非是遞歸等式的應(yīng)用,就看你能不能分解問題寫出遞歸式了)
1.括號(hào)化問題。
矩陣鏈乘: P=a1×a2×a3×……×an,依據(jù)乘法結(jié)合律,不改變其順序,只用括號(hào)表示成對(duì)的乘積,試問有幾種括號(hào)化的方案?(h(n)種)
2.出棧次序問題。
一個(gè)棧(無窮大)的進(jìn)棧序列為1,2,3,..n,有多少個(gè)不同的出棧序列?
類似:有2n個(gè)人排成一行進(jìn)入劇場。入場費(fèi)5元。其中只有n個(gè)人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達(dá)視作將5元入棧,持10元者到達(dá)視作使棧中某5元出棧)

3.將多邊行劃分為三角形問題。
將一個(gè)凸多邊形區(qū)域分成三角形區(qū)域的方法數(shù)?
類似:一位大城市的律師在她住所以北n個(gè)街區(qū)和以東n個(gè)街區(qū)處工作。每天她走2n個(gè)街區(qū)去上班。如果她
從不穿越(但可以碰到)從家到辦公室的對(duì)角線,那么有多少條可能的道路?
類似:在圓上選擇2n個(gè)點(diǎn),將這些點(diǎn)成對(duì)連接起來使得所得到的n條線段不相交的方法數(shù)?
4.給頂節(jié)點(diǎn)組成二叉樹的問題。
給定N個(gè)節(jié)點(diǎn),能構(gòu)成多少種形狀不同的二叉樹?
(一定是二叉樹!
先去一個(gè)點(diǎn)作為頂點(diǎn),然后左邊依次可以取0至N-1個(gè)相對(duì)應(yīng)的,右邊是N-1到0個(gè),兩兩配對(duì)相乘,就是h(0)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(0)=h(n))
(能構(gòu)成h(N)個(gè))




Cartalan數(shù)

令h(1)=1

h(n) = h(1)*h(n-1) + h(2)*h(n-2) + h(3)*h(n-3) + ....+h(n-1)*h(1) (其中n>=2)

該遞歸求解為h(n) = C(2n, n)/(n+1)

-------------------------------------------------------------------------------

Catalan數(shù)

中文:卡特蘭數(shù)
原理:
令h(1)=1,catalan數(shù)滿足遞歸式:
h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2)
另類遞歸式:
h(n)=((4*n-6)/(n))*h(n-1);
該遞推關(guān)系的解為:
h(n)=C(2n,n)/(n + 1) (n=1,2,3,...)

最典型的四類應(yīng)用(實(shí)質(zhì)上卻都一樣,無非是遞歸等式的應(yīng)用,就看你能不能分解問題寫出遞歸式了)
1.括號(hào)化問題。
矩陣鏈乘: P=a1×a2×a3×……×an,依據(jù)乘法結(jié)合律,不改變其順序,只用括號(hào)表示成對(duì)的乘積,試問有幾種括號(hào)化的方案?(h(n)種)
2.出棧次序問題。
一個(gè)棧(無窮大)的進(jìn)棧序列為1,2,3,..n,有多少個(gè)不同的出棧序列?
類似:有2n個(gè)人排成一行進(jìn)入劇場。入場費(fèi)5元。其中只有n個(gè)人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達(dá)視作將5元入棧,持10元者到達(dá)視作使棧中某5元出棧)

3.將多邊行劃分為三角形問題。
將一個(gè)凸多邊形區(qū)域分成三角形區(qū)域的方法數(shù)?
類似:一位大城市的律師在她住所以北n個(gè)街區(qū)和以東n個(gè)街區(qū)處工作。每天她走2n個(gè)街區(qū)去上班。如果她
從不穿越(但可以碰到)從家到辦公室的對(duì)角線,那么有多少條可能的道路?
類似:在圓上選擇2n個(gè)點(diǎn),將這些點(diǎn)成對(duì)連接起來使得所得到的n條線段不相交的方法數(shù)?
4.給頂節(jié)點(diǎn)組成二叉樹的問題。
給定N個(gè)節(jié)點(diǎn),能構(gòu)成多少種形狀不同的二叉樹?
(一定是二叉樹!
先去一個(gè)點(diǎn)作為頂點(diǎn),然后左邊依次可以取0至N-1個(gè)相對(duì)應(yīng)的,右邊是N-1到0個(gè),兩兩配對(duì)相乘,就是h(0)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(0)=h(n))
(能構(gòu)成h(N)個(gè))




*連載轉(zhuǎn)貼自 http://gpww.blog.163.com ,如圖片顯示有問題,請到原帖...

問題

《編程之美》中提到了“買票找零”問題,查閱了下資料,此問題和卡特蘭數(shù) Cn有關(guān),其定義如下:

image

卡特蘭數(shù)真是一個(gè)神奇的數(shù)字,很多組合問題的數(shù)量都和它有關(guān)系,例如:

  • Cn= 長度為 2n的 Dyck words的數(shù)量。 Dyck words是由 n個(gè) X和 n個(gè) Y組成的字符串,并且從左往右數(shù), Y的數(shù)量不超過 X,例如長度為 6的 Dyck words為:

XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY

  • Cn= n對(duì)括號(hào)正確匹配組成的字符串?dāng)?shù),例如 3對(duì)括號(hào)能夠組成:

((())) ()(()) ()()() (())() (()())

  • Cn= n+1個(gè)數(shù)相乘,所有的括號(hào)方案數(shù)。例如, 4個(gè)數(shù)相乘的括號(hào)方案為:


((ab)c)d (a(bc))d (ab)(cd) a((bc)d) a(b(cd))

  • Cn= 擁有 n+1 個(gè)葉子節(jié)點(diǎn)的二叉樹的數(shù)量。例如 4個(gè)葉子節(jié)點(diǎn)的所有二叉樹形態(tài):

  • Cn=n*n的方格地圖中,從一個(gè)角到另外一個(gè)角,不跨越對(duì)角線的路徑數(shù),例如, 4×4方格地圖中的路徑有:

  • Cn= n+2條邊的多邊形,能被分割成三角形的方案數(shù),例如 6邊型的分割方案有:

  • Cn= 圓桌周圍有 2n個(gè)人,他們兩兩握手,但沒有交叉的方案數(shù)。

在《Enumerative Combinatorics》一書中,竟然提到了多達(dá) 66種組合問題和卡特蘭數(shù)有關(guān)。

分析

“卡特蘭數(shù)”除了可以使用公式計(jì)算,也可以采用“分級(jí)排列法”來求解。以 n對(duì)括弧的合法匹配為例,對(duì)于一個(gè)序列 (()而言,有兩個(gè)左括弧,和一個(gè)右括弧,可以看成“抵消了一對(duì)括弧,還剩下一個(gè)左括弧等待抵消”,那么說明還可以在末尾增加一個(gè)右括弧,或者一個(gè)左括弧,沒有左括弧剩余的時(shí)候,不能添加右括弧。
由此,問題可以理解為,總共 2n個(gè)括弧,求 1~2n級(jí)的情況,第 i 級(jí)保存所有剩余 i 個(gè)左括號(hào)的排列方案數(shù)。 1~8級(jí)的計(jì)算過程如下表:

image

計(jì)算過程解釋如下: 1級(jí):只能放 1個(gè)“(”; 2級(jí):可以在一級(jí)末尾增加一個(gè)“)”或者一個(gè)“ (”
以后每級(jí)計(jì)算時(shí),如果遇到剩余 n>0個(gè)“(”的方案,可以在末尾增加一個(gè)“ (”或者“ )”進(jìn)入下一級(jí);遇到剩余 n=0個(gè)“(”的方案,可以在末尾增加一個(gè)“ (”進(jìn)入下一級(jí)。

奇數(shù)級(jí)只能包含剩余奇數(shù)個(gè)“(”的排列方案
偶數(shù)級(jí)只能包含剩余偶數(shù)個(gè)“(”的排列方案

從表中可以看出,灰色部分可以不用計(jì)算。

解法

關(guān)鍵代碼為:

      
        double
      
       Catalan(
      
        int
      
       n)
        {
            
      
        if
      
       (n == 0) 
      
        return
      
       1; 
      
        for
      
       (
      
        int
      
       i = 2; i <= 2 * n; i++)
            {
                var m = i <= n ? i : 2 * n + 1 - i;
                
      
        for
      
       (
      
        int
      
       j = (i - 1) & 1; j <= m; j += 2)
                {
                    
      
        if
      
       (j > 0) arr[j - 1] += arr[j];
                    
      
        if
      
       (j < n) arr[j + 1] += arr[j];

                    arr[j] = 0;
                }
            }
            
      
        return
      
       arr[0];
        }
    

其中:
n為 Cn中的 n;
arr = new double[n + 1];//arr代表有 k個(gè)括弧的時(shí)候,剩余 "("個(gè)數(shù)為 i的排列方案個(gè)數(shù) arr[1] = 1;

討論

算法復(fù)雜度為 image = O(n^2),空間復(fù)雜度為 O(n+1)。相對(duì)于利用公式計(jì)算而言,此方法的優(yōu)勢在于——沒有乘除法,只有加法。


編程之美 買票找零 寫的太贊了!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 乾安县| 南阳市| 友谊县| 图片| 红原县| 呈贡县| 广宁县| 聊城市| 乌拉特前旗| 广河县| 鄯善县| 晋州市| 云林县| 和硕县| 西平县| 中阳县| 武穴市| 马关县| 滨海县| 乌鲁木齐县| 和静县| 噶尔县| 航空| 五寨县| 古交市| 海宁市| 万安县| 昌都县| 龙江县| 杭锦旗| 昌宁县| 长宁县| 平邑县| 绥宁县| 林口县| 元阳县| 乌兰察布市| 礼泉县| 西乌珠穆沁旗| 吉水县| 锦屏县|