主要分成以下幾個部分:
排列組合與容斥原理
二項式定理
遞推關系與生成函數
polya定理
1.排列組合與容斥原理
排列組合里面的4個重要的基本原理:加法原理、乘法原理、減法原理、除法原理
前面兩個最為基本,后面兩個是根據前兩個派生出來的。乘法原理有的時候的應用很巧妙,可以作為一種打開思路的辦法。
基本的排列組合之后,接下來引出了多重集。多重集的排列組合是一個很經典的問題,總結如下:
多重集的排列:
全排列的話只需應用除法原理就可以了。n個元素的多重集的r排列需要利用指數生成函數來做。
多重集的組合:
n個元素的多重集的r組合,如果r小于等于任何一個元素可選的個數,那么就歸結為經典的不定方程的解數問題,可以利用“隔板法”來做。結果就是一個組合數。如果r大于某些元素的可選個數,那么一種方法是利用容斥原理,一種方法還是要依靠生成函數(編程序的時候可以用動歸做)。
如果是一個環形的排列組合,那么問題就困難許多,要利用置換群和polya定理。
單純的依靠四項基本原理來計數,有的時候會顯得力不從心,這個時候就需要容斥原理的幫助。容斥原理特別適合解決若干限制條件的交、并問題,也是打開思路的一種方法。
利用容斥原理解決的經典問題有:錯排問題,帶禁止位置的排列。禁位排列總覺得用容斥原理解決的不夠優美,不知道有沒有可以編程的數學方法。還有一個困惑的問題就是容斥原理和mobius反演的關系,那個地方好晦澀。。
跟排列組合相關的還有就是生成排列和組合。生成排列利用那個什么字典序法好像足夠了,編程好實現。生成組合方法類似。
2.二項式定理
有很多公式,用的時候可以現查。終于知道了三角形數原來跟排列組合有關,而且是一個很簡潔的公式。
很多公式的推導用的思想很妙。有一個很好的思想就是把(1 + x) ^ n利用二項式定理展開,然后求導、求積分,居然可以導出很多不可思議的公式。
還有一個很重要的定理就是pascal定理,pascal遞推式很有用(展開后有兩種形式,一種是上下限均不定,一種是下限不定),可以解決很多組合數的求和問題。
另外一個重要的定理就是牛頓二項式定理,在生成函數中應用廣泛,可就是推導起來有點繁。
3.遞推關系和生成函數
求解線性遞推關系的特征方程的方法還是有一定價值的,但是編程不適用。n解線性齊次遞推方程有矩陣解法。稍微復雜點的遞推關系(非線性),特征方程就不夠用了,必須祭出生成函數這個有力的武器。感覺生成函數實在是太優美、太強大了。生成函數的關鍵就是要把多項式拆分成(1-rx)^n這種形式,這樣就可以利用牛頓二項式定理展開了。
在特殊計數序列里面提到了盒裝球問題。將p個不同的球放入k個相同的盒子(每個盒子非空)的方法數是第二類Stirling數S(p, k);將p個相同的球放入k個相同的盒子(每個盒子非空)的方法數是分拆數,可以歸結為整數劃分問題,用動態規劃求解;將p個不同的盒子放入不同的k個盒子并且每個非空的方法數為k! * S(p, k)。
有幾個很經典的遞推關系:斐波那契數列、Catalan數(幾種經典的形式:三角剖分數、二叉生成樹個數、+1-1序列、加括號序列等等)、Stirling數(兩種,第二種比較常用)、漢諾塔、n個圓切割平面數、n條直線k個交點切割平面數等等。此外,格路徑中提到的平移、反射和一一對應這三種分析問題的方法也很值得借鑒。
4.polya定理
比較復雜,過一陣子好好總結下。
posted on 2009-05-04 09:17
sdfond 閱讀(578)
評論(0) 編輯 收藏 引用 所屬分類:
Algorithm - Combinatorics