烷基計數問題
求每個節點的兒子不超過三個,且大小為$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 最長上公升子串行之基礎...