斯特林數經常和組合數學中的上公升下降問題聯絡到一起。
第一類斯特林數:將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是...