今天被一道資料結構習題難住了,覺得挺有意思就寫博一篇記錄下來,被該題男主並非是不會用程式設計解決,而是考慮問題思維太狹窄導致的。
題目如下:
鐵路進行列車排程時, 常把站台設計成棧式結構的站台。試問:
設有編號為1,2,3,4,5,6的六輛列車, 順序開入棧式結構的站台, 則可能的出棧序列有多少種?
本題題意是,給定一組入棧順序,可在任意時刻任意出棧,求有多少種出棧方式。
看到題目瞬間就想當然認為是暴力列舉求解這道題,再一看答案,居然是用排列組合解出這道題的,不禁引誘我重新認真思考這道題。
經過長時間的思考和搜尋資料,終於了解到這個題目是用一種叫做:卡塔蘭數 的組合數求解的。
本問題可以轉換為:
對乙個2n長度的位串,其中有n個"1",n個"0",從左到右掃瞄時,"0"出現次數不能比"1"多(第一次出現"0"也作為非法位串)。
所以非法情況可以設為:
前2m+1次掃瞄中,出現了m+1次"0",m次"1"(此處m為小於n/2-1的任意非負整數),此時可確定該組合情況是錯誤情況,並且存在:後2n-2m-1次操作中,有n-m次"1",n-m-1次"0",此時可進一步分析,假設n-m個"1"與n-m-1個"0"互換,則總共變成了n+1個"0"和n-1個"1"。
此時我們猜想:
是否可以設想例外情況就是對n+1個"0"和n-1個"1"的組合?
進一步分析該猜想,對於此組合,"0"的個數比"1"多2個,則必有掃瞄時,第一次出現"0"的個數大於"1"的個數時,其後位串的所有"1"和"0"數目交換,則最終整個位串變成n個"1"和n個"0"的排序,並且該排序就是我們要找的非法排序。
歸納:由於n+1個"0"和n-1個"1"的組合數可以與例外排序一一對映,所以我們的例外情況總數為:
所以,最終總數為:
ps:卡塔蘭數--wiki
卡塔蘭數應用豐富,在計算機領域應用很廣泛,比如:
卡塔蘭數介紹與應用
5.總結 最近在leetcode上鍛鍊演算法題的時候,偶然看到一篇介紹卡塔蘭數的文章,在這之前其實已經簡單的了解過卡塔蘭數以及與之相關問題,溫故而知新,藉此機會重新整理和總結一下,同時自己也手動寫出了遞推公式的推理過程,畢竟很多人第一次看到卡塔蘭的遞推公式時,都會有疑問,這條公式是怎麼來的。題目描述...
Catalan數 卡塔蘭數 的證明
定義 從 0,0 到 n,n 不越過 可以接觸 直線y x 即每一步的落腳點都滿足y x 且每次只能往上或往右走。求方案數。結果 c 2n,n c 2n,n 1 程式設計是可以實現小資料的 n比較小時可以列舉,不過n可能會很大 證明方法 有很多種,自己上維基百科就能搜到 這裡給大家介紹一種不太常見的...
小兔的棋盤 hdu 2067 卡塔蘭數
description 小兔的叔叔從外面旅遊回來給她帶來了乙個禮物,小兔高興地跑回自己的房間,拆開一看是乙個棋盤,小兔有所失望。不過沒過幾天發現了棋盤的好玩之處。從起點 0,0 走到終點 n,n 的最短路徑數是c 2n,n 現在小兔又想如果不穿越對角線 但可接觸對角線上的格點 這樣的路徑數有多少?小...