組合數學之斯特林數 貝爾數

2021-08-22 17:57:58 字數 2009 閱讀 5491

斯特林數經常和組合數學中的上公升下降問題聯絡到一起。

第一類斯特林數:將n個不同的元素構成m個不同的環的方案數目(兩環不想等當且僅當任一不能通過旋轉得到另一環)

dp[i][j]表示i個元素構成j個環

有兩種情況可以得到dp[i][j]:

1.  前i-1個元素構成了j-1個不同的環,第i個元素單獨成環  共有 dp[i-1][j-1]種情況

2.  前i-1個元素構成了j個不同的環,第i個元素可以任意插入任何乙個環的任何乙個位置(不考慮順逆時針)共有 dp[i-1][j]*(i-1)中情況

得到第一類斯特林數的遞推式:dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*(i-1)

最後考慮邊界情況: dp[i][i]=1  dp[i][0]=0;

例題: hdu-4372  vj傳送門:

題目大意:給定n個樓房,高度從1~n,從左邊往右邊最多能同時看見a幢樓房,從右邊往左看最多同時看見b幢樓房

問有多少種合法的排列方式。

很顯然,是個組合數學的問題,然後還和lis有關。。聯想到斯特林數,接著分析題目。

從左或者從右是肯定都會看到最高的樓的,優先提出n,這樣n左邊的lis=a-1  右邊為 b-1

而如果是集合劃分問題的話,集合內部是無序的,很顯然不是這樣的,考慮環排序。

將n-1個數劃分為a+b-2個環,每個環用環中最大的數作為起點(也就是每個環用其中最大的數表示)

在a+b-2個環中選a-1個環 按照環中的最大值 公升序排序,這樣從左到右看過去每次只能看到每個環的最大值,恰好a-1個環就是lis為a-1,右邊降序同理。

這樣合法的方案數就為: sum=s1[n-1][a+b-2]*c[a+b-2][a-1];

#include const long long mod=1e9+7;

#define ll long long

ll s[2010][2010];

ll c[2010][2010];

void init()

}}using namespace std;

int main()

{ init();

//cout<>t;

while(t--)

{int n,a,b;

cin>>n>>a>>b;

if(a+b-2>n)

{cout<<0《第二類斯特林數:實質上是集合的拆分,表示將n個不同的元素拆分成m個集合的方案數

和第一類不同,集合是沒有順序的,所以第二種情況的時候不是*(i-1) 而是乘上當前的集合數量,即*j

同理可得:第二類斯特林數的遞推式:  dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j

hdu-2512  vj傳送門

有n張不同的卡,問有多少種集合劃分的方式

裸的第二類斯特林數:

#include #include using namespace std;

const int mod=1000;

int dp[2005][2005];//dp[i][j]表示共有i張卡,分成j堆的情況數

int sum[2005];

void init()

{ memset(dp,0,sizeof(dp));

memset(sum,0,sizeof(sum));

//dp[i][j]可以從兩種情況推出:

//對於第i張卡,如果前i-1張卡已經分為j堆,那麼第i張卡可以任意放入任何一堆中,即有dp[i-1][j]*(j)種放法

//如果前i張卡分為了j-1堆,那麼第i張卡只能自己形成乙個新的堆,即有dp[i-1][j-1]*1種放法

for(int i=1;i<2005;i++)

{dp[i][1]=1;dp[i][i]=1;//i張卡分成1堆和i堆只有一種情況

for(int j=2;j>t;

while(t--)

{cin>>n;

cout《這裡的sum[i] 就是貝爾數,其意義為有i個不相同的元素,劃分集合的方案數目

組合數學 斯特林數

斯特林數包括第一類斯特林數和第二類斯特林數 第一類斯特林數 定義 n個不同的元素構成m個圓排列 迴圈排列 的方法數 分成兩種情況 1 前n 1個元素已經構成了m個圓排列,只要將第n個元素插入1 n 1個元素中任意乙個元素的左邊即可 n 1 s n 1,m 2 前n 1個元素已經構成了m 1個圓排列,...

斯特林數和貝爾數

版權說明 抄寫了hypoc的部落格 符號 beginn m end 或 s n,m 意義 n 個不同球穿成 m 條項鍊的方案數。第 n 個球接在前面 n 1 個小球中某乙個的後面或新開一條項鍊。遞推式 s n,m n 1 s n 1,m s n 1,m 1 複雜度 o nm 考慮生成函式優化。第 i...

組合數學之放球問題 附斯特林數

放球問題在組合數學中是乙個經典問題,在acm比賽中也經常會出現類似的題目,這裡做乙個歸納。我們假定現在有n個球,要放到m個盒子中,根據情況的不同主要可以分為一下8類 這裡確保n m 編號n個球是否有區別 m個盒子是否有區別 是否允許空盒1否 否是2否 否否3否 是否4否 是是5是 否否6是 否是7是...