烷基計數 烷烴計數 n 2演算法

2022-10-11 10:27:10 字數 1092 閱讀 6199

烷基計數問題

求每個節點的兒子不超過三個,且大小為$n$的有根樹的數量。$1 \leq n \leq 2000$

設$f[i][j]$為總共$i$個節點,根節點度數為$j$的方案數。

考慮從$1到n-1$列舉乙個當前最大的子樹大小$sz$和選的個數$k$,把他接在原來的部分方案上。

於是就有

$f[i][j]+=f[i-sz*k][j-k]*h^_^ f[sz][m]}$

其中h為可重複的組合數,即$h^_$代表$n$個選$m$個可重複選的方案數,因為需要考慮子樹的同構。

滿足$h^_=c^_=\frac=\frac\prod_^ t$

證明見文末。

倒著列舉點的個數不會算重。

最後答案即是$\sum_^f[n][i]$.

ll h(int a,int b)

int main()$。

這時需要修改$f[i][j]$的定義,即總共$i$個節點,根的度數為$j$且滿足子樹大小小於$\frac $的方案數。

計算時sz必須滿足$sz < \frac $

為什麼是$\frac $?

分類討論一下:

當重心只有乙個時:此時$f[n]$最大子樹大小為$\frac $

當重心有兩個時:此時$f[\frac ]$的所有情況都被計算了。

所以這樣是剛好把條件全部滿足的。

接下來統計答案:

當重心只有乙個時,答案為$\sum_^ f[n][i]$.

當重心有兩個時,此時n一定是偶數,兩個重心相鄰且子樹大小均為$\frac$(重心的基本性質)。

所以答案需要額外加上$h^__][i]}}$

ll h(int a,int b)

int main()

cout<證明:  $h^_=c^_$

不妨設要在長度為$n$的排列中可重複地選擇$m$項,成為數列。

不妨設滿足$x_ \leq x_i$

令$t_i = x_i+i-1$

則有$t_

所以相當於在$[1,n+m-1]$中選擇不重複的$m$項構成$t_i$.

於是即證$h^_=c^_$.

排序演算法(n 2級)

選擇排序 簡單選擇排序 void selectsort t arr,int n swap arr i arr minindex 插入排序 簡單插入排序 寫法一 void insertsort t arr,int n 寫法二 void insertsort t arr,int n arr j temp...

排序演算法 n 2級別

n 2級別的演算法,是排序演算法中,效率最低的,也稱暴力法。主要有 選擇排序,插入排序,氣泡排序。效率較高的希爾排序 1.選擇排序 selection sort 原演算法思想是 從左到右遍歷出最大的,放到右端。然後繼續,每次拿出最大的,放在右端。template void selectionsort...

動態規劃 最長上公升子串行之基礎(經典演算法 n 2)

解題心得 1 注意動態轉移方程式,d j 1 d i d i d j 1 d i 2 動態規劃的基本思想 將大的問題化為小的,再逐步擴大得到答案,但是小問題的基本性質要和大的問題相同。3 這是動態規劃的經典方程式,但是耗時較多,在資料較大的時候會出現超時的情況。題目 1180 最長上公升子串行之基礎...