兩種特殊的排序組合計數公式

2021-06-21 12:32:30 字數 2791 閱讀 3988

/* 兩種特殊的排序組合計數公式*/

/* 第一種:calalan數

令h(1)=1,h(2)=1;

h(n)=h(1)h(n-1)+h(2)h(n-2)+...+h(n-1)h(1);

另類遞推式:

h(n)=h(n-1)*(4*(n-1)-2)/((n-1)+1);

遞推關係解:

h(n+1)=c(2n,n)/(n+1)(n=1,2,3...);

遞推關係的另類解為:

h(n+1)=c(2n,n)-c(2n,n+1)(n=1,2,3...);

注:c(n,r)是組合數

例如:1.乙個棧(無窮大)的進棧序列為1,2,3...,n,有h(n+1)個不同的出棧序列;

2.凸多邊形的三角規劃分:在乙個凸多邊形中,通過若干個條互不相交的對角線,把這個多邊形劃分了若干個三角形。

凸n邊形的不同劃分方案數為h(n-1)(n=2,3,4...);

3.給定節點組成二叉樹:給定n個節點,能夠成h(n)種不同二叉樹。

有h(n)種括號方案

*//*

5.poj 2084

這是乙個很小但是很古老的遊戲,請以順時針在地上寫下連續的數,1,2,3,4,5,6...2n-1,n,(n<=100)

形成乙個圓圈:然後,畫一些直線線段,將這些整數連成對,每乙個數都必須連線到另乙個數。

而且沒有兩條線段是相交。當你寫下來2n個數後,你能告訴大家可以用多少不同的方式將這些數連線成對。

輸入每行乙個正整數n,最後乙個-1,輸出:2n個連成對會有多少種連法

分析:設這條線段左邊有i對點,則其右邊有n-i-1對點,這樣我們可得遞推公式,f(i)=f(1)*f(i)+f(2)*f(i)+...+f(i)f(1);

可得;f(i)=h(i+1),其中h為catalan數

離線計算catalan序列,由於超過上線,採用高精度。

*/#include#include#includeusing namespace std;

struct bignum//高精度

c[120];

bignum operator*(bignum a,int b)

a.s[0]/=b;

while(a.s[a.leng-1]==0) a.leng--;

return a;

}void print(bignum a)

printf("\n");

}int main()

while(~scanf("%d",&n))

return 0;

}

/*

第二種 bell數和stiring數

bell數又稱為貝爾數。b(n)是包含n個元素的集合的劃分方法的數目。

例如:b(0)=1;b(1)=1;b(2)=2;b(3)=5;b(4)=15;b(5)=52;b(6)=203;

遞推公式:b(0)=1;b(n+1)=c(n,0)b(0)+c(n,1)b(1)+...+c(n,n)b(n);

stiring數又稱為斯特靈數。在組合數學中stiring數可指兩類數,

它們都是由18世紀的數家james stiring提出

第一類:含正負值,其絕對值是包含n個元素的集合分作k個環排列的方法數目,

遞推公式;s(n,0)=0;s(1,1)=1;s(n,k)=s(n-1,k-1)+(n-1)*s(n-1,k)

第二類:把包含n個元素的集合劃分為正好k個非空子集的方法的數目;

遞推公式:s(n,n)=s(n,1)=1;s(n,k)=s(n-1,k-1)+k*s(n-1,k);

顯然,每個bell數都是「第二類」的和,即b(n)=s(n,1)+s(n,2)+...+s(n,n);

bell數和第二類數可以通過構建貝爾三角形a得到。貝爾三角形的形式類似楊輝三角形

構建如下:

1、第一行第一項是1(a[1,1]=1);

2、對於n>1,第n行第一項等同於第n-1行最後一項(a[n,1]=a[n-1,n-1])

3、對於n,m>1,第n行第m項等於它左邊和左上方的兩個數之和a[n,m]=a[n,m-1]+a[n-1,m-1];

結果如下:

1 1 2

2 3 5

5 7 10 15

15 20 27 37 52

.......

.......

.......

*///uva 10844

/*題意是這樣的:要求計算乙個集合被分成幾個不相交子集的方案數,這符合bell數的定義#(n)=b(n);

先通過bell三角的方法,離線計算出範圍內的每個bell數,以後每輸入乙個n,即可從表中直接的答案

*/#include#include#include#include#includeusing namespace std;

__int64 m=10;

int max(int a,int b)

struct bigint

while(x);

} void print() }

}dp[2][1000],ans[1000];

bigint operator+(bigint a,bigint &b)

if(d) a.s[++a.l]=d;

return a;

}int n;

void gettans(int id,int nd)

void bellwork()

}int main()

return 0;

}//這個執行時間太長了,還待繼續研究

組合的兩種遞迴演算法

組合就是從n個物品中任意選擇m個組成一組,下面兩種遞迴演算法都可以求出不同的組合,如果待選物品當中有重複的,比如說下面 中an new char 變成 an new char,這兩種演算法依然有效,只不過要加一步去重複。tip 如果給出的陣列元素不是數字,比如是a,b,c,d,可以直接用陣列下標來進...

SSH的兩種組合配置方法

既可以使用 web.xml 來使 web 容器載入 spring,也可以通過 struts config.xml 來使 web 容器載入 spring。1 使用 web.xml 來使 web 容器載入 spring web.xml 通過 org.springframework.web.context...

快速排序的兩種實現

快速排序演算法是現在用的最廣的排序演算法,也是效率最高的。它有兩種實現方式,一種是定軸法,另外一種是挖坑法。這裡簡單介紹一下兩種實現方法的思想,並附上c 實現 一 定軸法 1.備份對軸 首記錄 2.取兩個指標left和right,初始值分別是序列的第二個元素和最後乙個元素,並且left right ...