x星球特別講究秩序,所有道路都是單行線。乙個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。
路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖【p1.png】所示。
x星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。
如果車輛進入檢查站和離開的次序可以任意交錯。那麼,該車隊再次上路後,可能的次序有多少種?
為了方便起見,假設檢查站可容納任意數量的汽車。
顯然,如果車隊只有1輛車,可能次序1種;2輛車可能次序2種;3輛車可能次序5種。 現在足足有16輛車啊,親!需要你計算出可能次序的數目。
思路:這道題其實是乙個進棧出棧的題,也就是問所有出棧順序的可能數,如果之前了解過這方面的問題的同學,這道題其實就是送分題,可以直接利用卡特蘭數的公式求解,不了解的話
可以看一下我之前寫的一篇部落格,也是關於進出棧次序的問題,有對卡特蘭數詳細的分析,下面是幾種網上的常見求解思路,做了一下總結
方法一:求出棧次序,無非就是問一共有多少種滿足要求的排列,滿足條件在本題中就是指,只有站中有「車」,才能夠出來。假設1,代表進站,0代表出站,r代表進棧的個數,l代表出棧的個數,易知
只有進棧的個數r大於等於出棧的個數l才可以出棧或進棧,否則只能進棧,因此可以進行回溯求出所有可能的方案。
1 #include2方法二:利用卡特蘭數的公式f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... +f(n-1)*f(0)3using
namespace
std;45
int num=0;6
789void dfs(int n,int r,int
l)18
1920
21if(r>l)else
4041
4243
return;44
45}4647
4849
intmain()
1 #include 2方法三:卡特蘭數的另一種遞推公式h(n)=h(n-1)*(4*n-2)/(n+1)3int
main()45
3233 printf("
%d",f[16
]);34
35return0;
3637 }
1 #include 2方法四:卡特蘭數遞推公式的解:h(n)=c(n,2n)*(2n-1) (n=0,1,2,...)3int
main()45
該種方法有一定的侷限性,因為n>14時資料會超出unsigned long long int 的範圍(0~2^64-1),不過可以考慮先求n=14的解,再用計算器推出n=16的解。
1 #include2總之熟記卡特蘭數即可。3using
namespace
std;
4int
m;5 unsigned long
long
int f(intn)6
12for(int i=2*n;i>n;i--)
15 // cout << m2 << "--"
<< m1 <
16 m=m2/m1;
17return
m;18}19
intmain()
2027
return0;
28 }
藍橋杯 出棧次序
題目描述 x星球特別講究秩序,所有道路都是單行線。乙個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖 p1.png 所示。x星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。如果車輛進入檢查站和...
藍橋杯 出棧次序 Python
題目 x星球特別講究秩序,所有道路都是單行線。乙個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖 p1.png 所示。x星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。如果車輛進入檢查站和離開...
資料結構學習 棧的出棧次序及次序種類
學過資料結構的程式猿應該都清楚,棧是一種先入後出,後入先出 lifo 的表。即插入和刪除都只能在乙個位置上進行,即棧頂位置。對棧的基本操作有push 入棧 和pop 出棧 在一般軟體研發的筆試中,就會經常遇到關於入棧次序一定時,出棧次序有哪些?共有幾種?其實,此處只要了解一下卡特蘭數的演算法結構,參...