卡特蘭數能夠解決的問題類似出棧順序問題,對於乙個有兩種操作1,2 且1,2操作分別有n次的序列必須嚴格保證操作1的次數在任意前k(k∈z)個操作中始終不小於操作2的次數,這種操作的方案數就是卡特蘭數c(2n,n)/(n+1)。
我們可以用折線的方式去證明卡特蘭數
在笛卡爾座標系中,令x軸表示當前第幾次操作,y軸表示當前情況下操作1比操作2多幾次。那麼折線在x軸上方則為合法方案。
而對於所有不合法的方案,一定存在某個正整數k,使得在前k個操作中操作2比操作1多1次,那麼我們讓從k+1~2n的所有操作1變成操作2,操作2變成操作1,那麼很容易就可以看出最後操作1比操作2少了2次,這也就是說,不合法的方案數就等價於在2n個操作中取n-1個操作1的方案數。
在座標系中也可以進行這樣的改變,不合法方案一定交於直線y=-1,讓折線關於y=-1對稱,那麼終點一定從(2n,0)變成了(2n,-2)。也可以很容易證明對稱總是可進行而且是可逆的。這樣操作1也比操作2少了兩次,方案數c(2n,n-1)。
所以合法方案數為c(2n,n)-c(2n,n-1)=c(2n,n)/(n+1)
例:【dbsdfzoj 1146】遞推 排隊買票
description
有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院一開始無其它鈔票,問有多少種排隊方法使得只要有10元的人買票,售票處就有5元的鈔票找零?
input
第一行輸入n(1<=n<=30)。
output
輸出乙個數表示排列的方法總數。
sample input
sample output
解題思路
對於任意正整數k<=2n,前k個人中有5元鈔票的人數一定不少於有10元鈔票的人數。假設人沒有編號,答案為卡特蘭數c(2n,n)/(n+1);當人存在編號時,對於當前某個方案,須分別計算有5元鈔票的人和有10元鈔票的人的全排列數,所以將答案乘(n!)^2,結果為(2n)!/(n+1)。
**
#include
int main()
折線法 卡特蘭數證明
1.飯後,姐姐洗碗,妹妹把姐姐洗過的碗乙個乙個地放進碗櫥摞成一摞。一共有n個不同的碗,洗前也是摞成一摞的,也許因為小妹貪玩而使碗拿進碗櫥不及時,姐姐則把洗過的碗摞在旁邊,問 小妹摞起的碗有多少種可能的方式?2.給定n個數,有多少種出棧序列?3.乙個有n個1和n個 1組成的字串,且前k個數的和均不小於...
卡特蘭數與折線法
問題舉例 元素1,2,3,4,5,6,7入棧,有多少種出棧的可能性?要點 卡特蘭數,折線法 這個問題分三種型別問,都是一樣的處理方法 解法 整個過程認為是從座標 0,0 走到 2n,0 入棧記為向右上方移動單位長度,出棧記為向右下方移動單位長度。棧內必須要有元素,不能為負值,所以,曲線不能在x軸下方...
卡特蘭數證明
1.飯後,姐姐洗碗,妹妹把姐姐洗過的碗乙個乙個地放進碗櫥摞成一摞。一共有n個不同的碗,洗前也是摞成一摞的,也許因為小妹貪玩而使碗拿進碗櫥不及時,姐姐則把洗過的碗摞在旁邊,問 小妹摞起的碗有多少種可能的方式?2.給定n個數,有多少種出棧序列?3.乙個有n個1和n個 1組成的字串,且前k個數的和均不小於...