第一 二類斯特林數,貝爾數

2022-04-28 17:15:08 字數 1210 閱讀 4093

s1[n][m]表示把n個元素劃分成m個非空迴圈排列集合的方案數

**

void getstirling()
s2[n][m]表示把n個元素劃分成m個非空集合的方案數

**

void getsstirling()
簡單闡述一下為什麼不用給s2[i][i]賦值為1

i = 1, j = 1時:s2[1][1] = 1;(這是由s2[i][1] = 1得到的)

i = 2, j = 2時:s2[2][2] = s2[1][1] + 2 * s2[1][2] = 1 + 2 * 0 = 1(這是因為j層迴圈不可能超過i,所以f[i]j的陣列永遠 == 0)

i = 3, j = 3時:s2[3][3] = s2[2][2] + 3 * s2[2][3] = 1 + 3 * 0 = 1

i = 4, j = 4時:s2[4][4] = s2[3][3] + 4 * s2[3][4] = 1 + 4 * 0 = 1

......

以此類推

f[i][i] = f[i - 1][i - 1] + i * f[i - 1][i] = 1 + i * 0 = 1;
繼續簡單闡述一下為什麼第一類斯特林數裡面預處理是從0開始而第二類斯特林數是從1開始

這是因為,在第一類斯特林數中,我們注意到,正式開始遞推的時候,s1[i][j]中的i,j都是從1開始列舉,也就是說一定是會在第一次迴圈中用到f[0][0]。那麼,我們就需要對f[0][0]賦上初值來保證它的遞推不出問題。

而在第二類斯特林數中,s2[i][j]中的i還是從1開始列舉,而j是從2開始列舉的(並且 j <= m && j <= i),於是在遞推的過程中,我們不需要使用s2[0][0]的值,也就不需要對它賦初值。(而且第二類斯特林數賦值是賦的s2[i][1],顯然s2[0][1]應該==0)

b[n]表示把n個元素劃分成若干個非空集合的方案數(這個方案數肯定是 <= n的)

**

b[n] = s2[n][1] + s2[n][2] + s2[n][3] + ...s2[n][n];//由於我太懶了所以。。。。

斯特林數和貝爾數

版權說明 抄寫了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...

HDU 2512 (斯特林數,貝爾數)

題目意思 給你n個數,讓你組成從1 n個不重集合的組合數目是多少?題解思路 知識點 組合數學中的第二斯特林數,貝爾數 注意,在這道題裡,i要從1開始,接下只要先求s2 0,0 s2 2000,2000 之後逐次累加到bell n 即可 include define register int rint...

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

斯特林數經常和組合數學中的上公升下降問題聯絡到一起。第一類斯特林數 將n個不同的元素構成m個不同的環的方案數目 兩環不想等當且僅當任一不能通過旋轉得到另一環 dp i j 表示i個元素構成j個環 有兩種情況可以得到dp i j 1.前i 1個元素構成了j 1個不同的環,第i個元素單獨成環 共有 dp...