主要分成以下几个部分:
排列组合与容斥原理
二项式定理
递推关系与生成函数
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 阅读(561)
评论(0) 编辑 收藏 引用 所属分类:
Algorithm - Combinatorics