1. 程式人生 > >POJ2084 Game of Connections 卡特蘭數 關於卡特蘭數經典的幾個問題

POJ2084 Game of Connections 卡特蘭數 關於卡特蘭數經典的幾個問題

可能 2個 nbsp 二叉樹 air sta memory poj 線段

Game of Connections
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 9128 Accepted: 4471

Description

This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, . . . , 2n - 1, 2n consecutively in clockwise order on the ground to form a circle, and then, to draw some straight line segments to connect them into number pairs. Every number must be connected to exactly one another.
And, no two segments are allowed to intersect.
It‘s still a simple game, isn‘t it? But after you‘ve written down the 2n numbers, can you tell me in how many different ways can you connect the numbers into pairs? Life is harder, right?

Input

Each line of the input file will be a single positive number n, except the last line, which is a number -1.
You may assume that 1 <= n <= 100.

Output

For each n, print in a single line the number of ways to connect the 2n numbers into pairs.

Sample Input

2
3
-1

Sample Output

2
5

Source

Shanghai 2004 Preliminary 參考博客: https://blog.csdn.net/sdj222555/article/details/7260739

卡特蘭數又稱卡塔蘭數,是組合數學中一個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)命名。

原理

  令h(1)=1,h(2)=1,catalan數滿足遞歸式:   h(n)= h(1)*h(n-1)+h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=3)   例如:h(3)=h(1)*h(2)+h(2)*h(1)=1*1+1*1=2   h(4)=h(1)*h(3)+h(2)*h(2)+h(3)*h(1)=1*2+1*1+2*1=5   另類遞歸式:   h(n)=h(n-1)*(4*n-2)/(n+1);   該遞推關系的解為:   h(n)=C(2n,n)/(n+1) (n=1,2,3,...)

卡特蘭數的應用

實質上都是遞歸等式的應用

括號化問題

  矩陣鏈乘: P=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)

出棧次序問題

  一個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?   分析   對於每一個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態‘1’,出棧設為狀態‘0’。n個數的所有狀態對應n個1和n個0組成的2n位二進制數。由於等待入棧的操作數按照1‥n的順序排列、入棧的操作數b大於等於出棧的操作數a(a≤b),因此輸出序列的總數目=由左而右掃描由n個1和n個0組成的2n位二進制數,1的累計數不小於0的累計數的方案種數。   在2n位二進制數中填入n個1的方案數為c(2n,n),不填1的其余n位自動填0。從中減去不符合要求(由左而右掃描,0的累計數大於1的累計數)的方案數即為所求。   不符合要求的數的特征是由左而右掃描時,必然在某一奇數位2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即一個不合要求的數對應於一個由n+1個0和n-1個1組成的排列。   反過來,任何一個由n+1個0和n-1個1組成的2n位二進制數,由於0的個數多2個,2n為偶數,故必在某一個奇數位上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應一個不符合要求的數。   因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。   顯然,不符合要求的方案數為c(2n,n+1)。由此得出 輸出序列的總數目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)。   (這個公式的下標是從h(0)=1開始的)   類似問題   有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)

凸多邊形的三角剖分問題

  求將一個凸多邊形區域分成三角形區域的方法數。   類似:一位大城市的律師在她住所以北n個街區和以東n個街區處工作。每天她走2n個街區去上班。如果她從不穿越(但可以碰到)從家到辦公室的對角線,那麽有多少條可能的道路?   類似:在圓上選擇2n個點,將這些點成對連接起來使得所得到的n條線段不相交的方法數?

用給定節點組成二叉樹的問題

  給定N個節點,能構成多少種不同的二叉樹?   (能構成h(N)個)   (這個公式的下標是從h(0)=1開始的)

然後這個題目就是一個裸的卡特蘭數,因為到後面爆了long long,所以這裏直接用了java的大數

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		BigInteger [] a = new BigInteger [105];
		a[0] = BigInteger.ONE;
		a[1] = BigInteger.ONE;
		for( int i = 2; i <= 101; i ++ ) {
			a[i] = a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
		}
		Scanner cin = new Scanner(System.in);
		while( cin.hasNext() ) {
			int n = cin.nextInt();
			if( n == -1 ) {
				break;
			}
			System.out.println(a[n]);
		}
	}
}                 

  

POJ2084 Game of Connections 卡特蘭數 關於卡特蘭數經典的幾個問題