1. 程式人生 > 實用技巧 >4.3 買票找零問題

4.3 買票找零問題

4.3 買票找零問題

基礎問題:在一場激烈的足球賽開始前,售票工作正在緊張的進行中。每一張球票為50元。現在有2n個人排隊購票,其中有n個人手持50元的鈔票,另外n個人手持100元的鈔票,假設開始售票時,售票處沒有零錢.問這2n個人有多少種排隊方式,不至於售票處出現找不開錢的局面?

answer

\[res = C_{2n}^n - C_{2n}^{n-1} = \frac{1}{n+1}C_{2n}^n \]

Catalan 數

先介紹卡特蘭數:

  • Catalan 滿足遞迴式:\(h(n) = h(0) * h(n-1) + h(1) * h(n-2) + ...+h(n-1) * h(0)\)
  • Catalan 另類遞推式:\(h(n) = \frac{h(n-1) * (4*n-2)}{n+1}\)
  • 遞推關係的解為:\(C_n = C_{2n}^n - C_{2n}^{n+1} = \frac{1}{n+1}C_{2n}^n\)

卡特蘭數的證明:

給出一個n,要求一個長度為2n的0,1序列,使得序列的任意字首中1的個數不少於0的個數

證明:

考慮一個含有n個1,n個0的2n位二進位制數字,掃描到第2m+1位上的時候有m+1個0和m個1,則後面0,1 的個數分別為:有n-m個1和n-m-1個0,
將2m+2以及之後的0變成1,1變成0,則對應一個n+1個0和n-1個1的二進位制數,不符合要求
從而\(C_n = C_n = C_{2n}^n - C_{2n}^{n+1} = \frac{1}{n+1}C_{2n}^n\)

拓展問題:

1 矩陣連乘問題:\(P = a_1 * a_2 * a_3 * ... * a_n\)依據乘法結合律,不改變矩陣的相互順序,只用括號表示成對的乘積,試問有幾種括號化的方案?

左括號相當於1,右括號相當於0,本質上就是卡特蘭數

2 將多邊形劃分稱為三角形問題。求一個凸多邊形區域劃分稱為三角形區域的方法數。

我們從節點1開始考慮,要想分割成為三角形區域,節點1不能和他相鄰的節點相連,所以節點1可以連線3,4...n-1
我們假設節點1連線i,則這條線將多邊形區域分割成為i凸多邊形和N+2-i凸多邊形,即對於節點1,\(f_1(n) = f(3)*f(n+2-3) + ... + f(n-1)f(3)\)


總的分割方法是\(N*f_1(n)\),其中一半是重複情況

\[f(n) = \sum_{i=3}^{n-1}f(i)*f(n+2-i)*\frac{n}{2} \]

3 某一個城市的某個居民,每一天他需要走2n個街區去上班(他在其住所北n個街區和以東n個街區工作)。如果他從不穿越從家到公司的對角線,那麼有多少條可能的道路?

符合卡特蘭數

4 在圓上選擇2n個點,將這些點成對連線起來,求使所得到的n條線段不相交的方法數?

類似於拓展2

5 n個節點可以構造出多少不同的二叉樹?

n = 0 , f(0) = 1
n = 1 , f(1) = 1
n = 2 , f(2) = 4

\[f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(i)*f(n-i-1) + ... + f(n-1) * f(0) \]

其中\(f(i)*f(n-i-1)表示左子樹有i個節點右子樹有n-i-1個節點時候可構造的數目\)
符合卡特蘭數


// 4.3 買票找零
// 卡特蘭數
class Test{
	public static void main(String[] args) {
		/**
		基礎問題:
			在一場激烈的足球賽開始前,售票工作正在緊張的進行中。每一張球票為50元。現在有2n個人排隊購票,其中有n個人手持50元的鈔票,另外n個人手持100元的鈔票,假設開始售票時,售票處沒有零錢。
			問這2n個人有多少種排隊方式,不至於售票處出現找不開錢的局面?
		answer
			$$res = C_{2n}^n - C_{2n}^{n-1} = \frac{1}{n+1}C_{2n}^n$$

		*/
		/**
		先介紹卡特蘭數:
			Catalan 滿足遞迴式:$h(n) = h(0) * h(n-1) + h(1) * h(n-2) + ...+h(n-1) * h(0)$
			Catalan 另類遞推式:$h(n) = \frac{h(n-1) * (4*n-2)}{n+1}$
			遞推關係的解為:$C_n = C_{2n}^n - C_{2n}^{n+1} = \frac{1}{n+1}C_{2n}^n$
		卡特蘭數的證明:
			給出一個n,要求一個長度為2n的0,1序列,使得序列的任意字首中1的個數不少於0的個數
			證明:
				考慮一個含有n個1,n個0的2n位二進位制數字,掃描到第2m+1位上的時候有m+1個0和m個1,則後面0,1 的個數分別為:有n-m個1和n-m-1個0,
				將2m+2以及之後的0變成1,1變成0,則對應一個n+1個0和n-1個1的二進位制數,不符合要求
				從而$C_n = C_n = C_{2n}^n - C_{2n}^{n+1} = \frac{1}{n+1}C_{2n}^n$
		*/
		/**
		拓展問題:
			1 矩陣連乘問題:$P = a_1 * a_2 * a_3 * ... * a_n$依據乘法結合律,不改變矩陣的相互順序,只用括號表示成對的乘積,試問有幾種括號化的方案?
				左括號相當於1,右括號相當於0,本質上就是卡特蘭數
			2 將多邊形劃分稱為三角形問題。求一個凸多邊形區域劃分稱為三角形區域的方法數。
				我們從節點1開始考慮,要想分割成為三角形區域,節點1不能和他相鄰的節點相連,所以節點1可以連線3,4...n-1
				我們假設節點1連線i,則這條線將多邊形區域分割成為i凸多邊形和N+2-i凸多邊形,即對於節點1,$f_1(n) = f(3)*f(n+2-3) + ... + f(n-1)f(3)$
				總的分割方法是$N*f_1(n)$,其中一半是重複情況
				$$f(n) = \sum_{i=3}^{n-1}f(i)*f(n+2-i)*\frac{n}{2}$$
			3 某一個城市的某個居民,每一天他需要走2n個街區去上班(他在其住所北n個街區和以東n個街區工作)。如果他從不穿越從家到公司的對角線,那麼有多少條可能的道路?
				符合卡特蘭數
			4 在圓上選擇2n個點,將這些點成對連線起來,求使所得到的n條線段不相交的方法數?
				類似於拓展2
			5 n個節點可以構造出多少不同的二叉樹?	
				n = 0 , f(0) = 1
				n = 1 , f(1) = 1
				n = 2 , f(2) = 4
				$$f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(i)*f(n-i-1) + ... + f(n-1) * f(0)$$
				其中$f(i)*f(n-i-1)表示左子樹有i個節點右子樹有n-i-1個節點時候可構造的數目$
			符合卡特蘭數
		*/
		
	}
}