1、2005年浙江省队培训 第2讲 组合计数,目录,一、置换群 二、组合数学基础 三、生成函数 四、等价类计数 五、递推法,一、置换群,群,群是集合G和其上的二元运算*, 并满足 封闭性: 对于群里元素a, b, a*b也在G内) 结合律: (a*b)*c = a*(b*c) 单位元: 存在e, 对于每个元素a*e=e*a=a 逆元: 对于每个元素a, 存在b使a*b=b*a=e, 记b=a-1 一般简写a*b为ab,置换,用置换表示1被a1取代, 2被a2取代n被an取代. 其中a1, a2, an是1n的一个排列,置换群,置换群的元素是置换, 运算是置换的连接可以验证置换群满足群的四个条件,定
2、理,设G是1n的置换群, K是1n的某个元素 G中使K保持不变的置换集合, 记为Zk, 称为K不动置换类 K在G作用下的轨迹记为Ek, 也就是通过置换G能变换到的元素集合 定理: |Ek| * |Zk| = |G| (证明略),循环,n阶循环每个置换都可以写若干互不相交的循环的乘积, 例如表示是唯一的. 置换的循环节数是上述表示中循环的个数, 上例的循环节数是3,传球游戏,n个人围成一圈, 每个人编号为1n. 有n个球, 编号也为1n. 一开始每人手里拿一个球 基本操作为对传, 即a手里的球和b手里的球交换. 每个时间单位, 一个人可以不做任何动作, 或者与另外一人对传 目标: 每个人拿到和自
3、己编号相同的球 问题1: 至少需要多少次对传? 问题2: 至少需要多少时间?,分析,用置换表示初始状态 每次对传相当于乘以一个对换 置换可以唯一地表示成若干循环的乘积, 因此只考虑循环乘以对换(a, b)的结果 a和b属于不同循环 a个b属于同一个循环,分析,情况一: a和b属于不同循环 因为循环的任何一个元素都可写成第一个,不妨设两个循环为(a, a1, a2, an)和(b, b1, b2, , bm) 结果为(b,b1,b2,bm,a,a1,a2,an) 结论: 两个循环合并成一个,分析,情况二: a和b属于同一个循环 设为(a,a1,a2,ai,b,b1,b2,bm), 乘以(a,b)
4、后变为(a,a1,a2,ai)(b,b1,b2,bm) 可以这样理解: 乘以(a,b)是自身的逆操作 结论: 一个循环拆为了两个,分析,问题1: 由于目标状态是(1)(2)(n), 所以需要不断的拆循环. 答案为n-c. 其中c为轮换个数 问题2: 结论非常简单 循环长度为1, 次数为0, 显然 循环长度为2, 次数为1, 显然 循环长度大于等于3的时候呢?,分析,循环长度大于等于3, 次数为2. 对于循环(a1,a2,an), 只需要乘以(a2,an), 就变成了(a1,an)(a2,a3,an-1), 再乘以(a3,an-1), 就变成了(a2,an-1)(a3,a4,an-2)等等 因此
5、只需要乘以(a2,an)(a3,an-1)(a4,an-2)就可以得到(a1,an)(a2,an-1)(a3,an-2)再对换一次就可以了,无聊的排序,你弟弟有一项家庭作业需要你帮助完成。老师给了他一列数,需要他把这些数按升序排列。你可以每次交换两个数的位置,而一次交换的代价被定义成交换的两个数的和。写一个程序,用最小的交换代价和来帮助弟弟完成这项无聊的排序工作。,分析,从初始状态变为目标状态可以看作完成一个置换. 把置换分解为s个不相交循环乘积 各循环是独立的, 所以依次完成各个循环 对于任意循环i, 设它的长度为ki, 容易证明至少需要交换ki-1次, 即每次让一个元素到达目标, 则前ki
6、-1个元素到达目标后最后一个元素也到达目标,分析,显然每个元素至少参与一次交换. 既然交换次数一定, 应该让循环中的最小元素ti参加所有交换, 其他元素各只参加一次 例如(8 2 7), 2占了7的位置, 则2和7交换; 2又占了8的位置, 则2和8交换 花费为sumi+(ki-2)*ti,其中sumi为第i个循环所有数之和,分析,特殊情况: 先让ti和全局最小值m交换, 让m进入循环, 然后和所有元素交换一次后再和ti交换,花费为sumi+ti+(ki+1)m 例如1,8,9,7,6,目标状态为1,6,7,8,9, 分解为(1)(8 6 9 7), 考虑第二个循环 方案一: 花费为30 +
7、(4-2)*6 = 42 方案二: 花费为30 + 6 + (4+1)*1 = 41,分析,程序实现: 只需要记录每个循环节的长度ki和它的最小元素ti, 不需要模拟交换 找循环最多访问每个元素一次, 时间复杂度是线性的,同构计数,一个竞赛图是这样的有向图 任两个不同的点u、v之间有且只有一条边 不存在自环 用P表示对竞赛图顶点的一个置换。当任两个不同顶点u、v间直接相连的边的方向与顶点P(u)、P(v)间的一样时,称该图在置换P下同构 对给定的置换P,我们想知道对多少种竞赛图在置换P下同构,同构计数,例:有顶点1、2、3、4和置换P:P(1)=2,P(2)=4,P(3)=3,P(4)=1 对
8、于下图的四种竞赛图,在置换P下同构,分析,先把置换它分解成为循环, 首先证明长度为L的偶循环将导致无解 对于点i1, 记P(ik)=ik+1, 假设i1和iL/2+1的边方向为i1-iL/2+1, 那么有i2-iL/2+2, i3-iL/2+3, , iL/2+1-i1, 和假设矛盾! 假设确定其中k条独立边后其他边也会确定, 则答案为2k 考虑两类边: 循环内边和循环间边.,分析,循环内顶点的关系 定了i1和ij之间的关系, ik与i(k+j-2) mod n+1之间的关系也被确定下来了, 因此只需要确定i1和i2, i3, , i(L-1)/2+1这(L-1)/2对顶点的关系 不同循环间顶
9、点的关系 设循环为(i1,i2,iL1)和(j1,j2,jL2), 通过类似分析得只需要确定gcd(L1, L2)对关系即可,分析,最后答案为2k1+k2 其中k1=sum(L-1)/2, k2=sumgcd(L1, L2) 可以用二分法加速求幂,二、组合数学基础,单色三角形,给定空间里的n个点,其中没有三点共线。每两个点之间都用红色或黑色线段连接。如果一个三角形的三条边同色,则称这个三角形是单色三角形。 对于给定的红色线段的列表,希望能找出单色三角形的个数。,分析,三角形只有单色和非单色两种 非单色三角形的个数等于由一个点连接两条非同色线段的情况数的一半。 设第i个点连接的红色线段数为ri,
10、由于每个点只引出红色或黑色的线段,故黑色线段数目为n-1-ri。由乘法原理,第i个点连接两条非同色线段的情况数为ci=ri(n-1-ri)。每个非单色三角形被算了两次, 因此答案为c(n,3) - sumci/2,电子锁,某机要部门安装了电子锁。M个工作人员每人发一张磁卡,卡上有开锁的密码特征。为了确保安全,规定至少要有N(=M)个人同时使用各自的磁卡才能将锁打开,并且任意N个人在一起都能将锁打开 电子锁上至少要有多少种特征? 每个人的磁卡至少要有几个特征?,分析,任意N-1个人在一起,都无法将锁打开,从而必然缺少一种开锁的密码特征A;并且在其余的M-(N-1)个人中,任意一人加入到N-1个人
11、中,他们就能将锁打开 结论1: 每M-(N-1)个人拥有一个共同的特征,分析,设一个N-1人组G所缺少的特征为M(G) 结论: 任两个不同的G的M(G)都不同 反证法. 设M(G1)=M(G2)=M. 显然G1G2至少包含N个人且他们都缺少特征M,故这些人在一起无法将锁打开,矛盾 一共有C(M, N-1)个N-1人组, 因此 结论2: 总特征数tot = C(M, N-1),分析,对于每一个工作人员T来说, 在其余M-1个人中任选N-1个人在一起都会因为缺少某种特征而无法开锁,而这缺少的特征必须是T所具备的 由于这些缺少的特征各不相同, 所以T的磁卡上至少需要有C(M-1,N-1)个特征,分析
12、,构造法: 枚举M人选M-(N-1)人的组合, 给它们赋于一个新的共同的特征 合法性: 对于每N-1个人, 不具备剩下M-(N-1)拥有的公共特征, 因此打不开门; 由于这N-1个人具备其他所有特征(其他特征在分配时至少分配到了这N-1个人中的一个), 所以随便再找一个就可以打开门 最优性: 由结论2, 这个方案是最优的,用AND算XOR,对于2n位二进制数A,分成两个n位数后进行AND操作,返回n位数。记该操作为ANDn(A),同理可定义XORm(A) 给定n,求满足mn的条件下,最大的m值,使得存在 编码映射g1,将2m位数映射为2n位数,和 解码映射g2,将n位数映射为m位数 使得XOR
13、m(A)=g2(ANDn(g1(A),分析,XORm(A): 有2m个象,每个都有2m个原象 ANDn(A): 原象有3k的象有C(n,k)个 问题转化为:有2n个箱子,其中有C(n,i)个容积为3i,求m(mn)的最大值,使得2m个大小为2m的物品可以被放入 算法:二分枚举m,算出每一种箱子可以放多少物品,再乘以这种箱子的数量,检测总和是否满足。需要高精度. 时间复杂度:O(nlogn),彩票,大街上到处在卖彩票,一元钱一张。购买撕开它上面的锡箔,你会看到一个漂亮的图案。图案有n种,如果你收集到所有n种彩票,就可以得大奖。请问,在平均情况下,需要买多少张彩票才能得到大奖呢?,分析,已经有k个
14、图案, s=k/n, 拿到一个新的需要 1次的概率: 1-s 2次的概率: s*(1-s) t次的概率: st-1*(1-s) 期望: 概率加权和 (1-s)*(1 + 2s + 3s2 + 4s3 + ) = (1-s)E 而sE = s + 2s2 + 3s3 + = E-(1+s+s2+) 移项得(1-s)E = 1+s+s2+=1/(1-s) = n/(n-k),分析,总结 已有0个图案: 拿1次就可以多搜集一个 已有1个图案: 平均拿n/(n-1)次就可多搜集一个 已有k个图案: 平均拿n/(n-k)次就可多搜集一个 所以总次数为: n(1+1/2+1/3+1/n),Pibonacc
15、i数,可以对任何实数x0定义一个函数P(x): 给定整数x(x30,000),计算P(x) P(4)=2, P(25)=4024, P(47)=14,355,865,分析,由于每次递归不是减1,就是减pi,因此任意时刻P函数的参数都是x减去整数个1和整数个pi 由于递推边界都是不大于4的非负实数,令让r(i)表示满足x-i-j*pi4的j的最小值,则有r(i)=(x-i-4)/pi,且任意一个递推边界都可以表示成P(x-i-r(i)*pi),分析,用待定系数法. 设P(x i r(i)*pi)的系数为ai,则最后答案为a0+a1+ax-3, 则问题的关键是求ai 递归的时候P(x)转化成了P(
16、x-pi), 因此P(x i r(i)*pi)是由P(x)经过i+r(i)层递归得到的, 且恰好有i层减1, r(i)层减pi 若x-i-r(i)*pi =3, 则最后一层有两种可能, 因此 ai=C(i+r(i), i) 若x-i-r(i)*pi3, 则最后一层必须是x-pi得到, 因此ai=C(i+r(i)-1,i),分析,称满足第一个条件的i为A类数, 满足第二个条件的i为B类数, 那么最简单的方法是每次判断i的类型, 然后计算组合数, 每步O(i2), 共O(x3) 改进: 注意到ai和ai-1相差并不大, 记di=ai/ai-1,则ai=ai-1*di. 设ai-1=C(m, i-1
17、), ai=C(m+a, i), 由于r(i)-r(i-1)分0即1, 故-1=a=2, 因此,分析,则计算di始终是常数级别的, 因此时间复杂度为O(x). 另外需要高精度运算,三、生成函数,生成函数,定义一个序列ai 的生成函数(或称“母函数”)为a0+a1x+a2x2+a3x3+ 为什么要定义这样一个函数呢? 因为生成函数把ai 的所有信息浓缩到了一个多项式里 可以把它作为整体进行运算,而不需要单独考虑每一个ai 。 类似定义指数生成函数:,一般排列组合问题,有k种元素 重数均为无限大 第i种元素选的个数ci必须属于一个给定的集合Si 求r排列数和r组合数,并列举出方案 对于每个元素k构
18、造序列ai(k),其中ai(k)等于1当且仅到iSk 设该问题的r组合数br,则序列bi的生成函数等于所有ai(k)的生成函数的积 设该问题的r排列数为cr,则序列ci的指数生成函数等于所有ai(k)的指数生成函数的积,一般排列组合问题,有苹果、香蕉和桃子三种水果 苹果只能选不超过3个, 选香蕉的个数必须是5的倍数, 而桃子只能选2,3或者5个 问要选k个水果有几种方法? 写出生成函数 苹果:S1=0,1,2,3,生成函数是1+x+x2+x3 香蕉:S2=5,10,,生成函数是x5+x10+x15+ 桃子:S3=2,3,5,生成函数是x2+x3+x5 因此r组合数序列的生成函数是(1+x+x2
19、 +x3 )(x5 +x10 +x15 +)(x2 +x3+x5) 把多项式展开后,xk项的系数就是所求,巧克力,有袋子里均匀地装着c种颜色的巧克力,每种巧克力均有无限多。佳佳每次从袋子里拿一块放在桌子上,如果桌子上已经有一块颜色相同的巧克力,佳佳就把两块巧克力都吃掉。佳佳一共取出n块巧克力,请问最后桌上有m块的概率有多大?例如c=5,n=100,m=2时,概率为0.625。,分析,由于mc或者mn或者m和n不同奇偶性时概率为0,以下均认为mminc, n,且m和n同奇偶。 方法一: 递推法。设di,j为取出i块巧克力,恰好有j块的概率,则 di,j=di-1,j-1*(c-j+1)/c +
20、di-1,j+1*(j+1)/c 算法的复杂度为O(nc)。,分析,本题实际上是要让m种颜色取奇数个,c-m种颜色取偶数个,求排列有多少种 回忆: 奇数项指数生成函数为(ex-e-x)/2,偶数项生成函数为(ex+e-x)/2 由于哪m种颜色取奇数个并不确定,方案数要乘以C(c,m),再除以总方案数cn得到概率 答案为下式的xn的系数,分析,为了求上式的xn的系数, 做展开由于ekx的xn系数为kn/n!, 因此所求概率为,分析,时间复杂度分析 花O(c2)的时间做多项式展开, 得到tk 花O(c)的时间算组合数和2c 花O(c)的时间求和(每一项用对数) 总时间O(c), 和n无关 附加结论
21、: n比较大时概率约为,分析,引理1: |tk|=500时, 2*10-9 证明: 0kc时-c+2=2k-c=c-2, 因此,分析,定理的证明: 显然t0=(-1)m, tc=1, 把 的首尾项分离出来, 得进而有 而第二项,分析,总结 算法一: 递推. O(nc) 算法二: 生成函数. O(c2) 附加结论: n500时可以O(c)计算,四、等价类计数,着色问题,对22的方阵用黑白两种颜色涂色,问能得到多少种不同的图像?经过顺时针旋转能吻合的两种方案算同一种方案,原问题的置换,给四个格子1,2,3,4着k=2种颜色 用置换群定义定价类: 置换一(转0度): (1,2,3,4) 置换二(转9
22、0度):(2,3,4,1) 置换三(转180度):(3,4,1,2) 置换四(转270度):(4,1,2,3) G=转0度,转90度,转180度,转270度,Burnside引理,对于一个置换f, 若方案s变换到自己, 称它为f的不动点. f的不动点数目记为C(f) Burnside引理: 等价类数目为C(f)的平均值 考虑所有满足方案s是置换f的不动点的(s,f)对. 则数目= sumCf=sumZk 假设有L个等价类, 由于处于同一个等价类的Zk相同, 因此sumZk中每个等价类可以合并在一起, 即sumEk*Zk, 其中每个等价类取一个k 由基本定理, 这个和为L*G. 因此L=sumC
23、f/L,Burnside引理计算举例,故方案数为所有C(f)的平均数,即(16+2+4+2)/4=6,和枚举的结果一致,Plya定理,Burnside定理需要计算每个置换f的不动点数目C(f) 方案一: 对有所有着色方案, 检查它是否为f的不动点. 缺点: 着色方案非常多! 方案二: 把f分解成循环的乘积. 不动点必然满足每个循环内的颜色相同. 如果有m(f)个循环, 则有km(f)个不动点 方案二称为Polya定理,Plya定理计算举例,不同方案数为(24+21+22+21)/4=6,一般情况,n*n的格子, 涂m种颜色 分n为奇数和偶数两种情况讨论,环面,将一张黑白格子的纸,长边贴起来,组
24、成一个圆柱,接下来两个底边(圆)再贴起来,组成一个环面,类似救生圈的形状,环面,给定原始的纸的大小N*M,让我们任意染色,求出本质不同的环面的数量。 有两点注意: 如果N=M,那么有两种组成圆柱的方案。 “内侧面”和“外侧面”是可以被区分开来的,即纸不是透明的,反面不可使用,分析,置换 每一行循环右移1格 每一列循环下移1格 旋转180度,注意不是翻转,考虑一张纸不改变上下面,只能通过旋转。 旋转90度,只在N=M时可用 求出每个置换的循环节, 套用Polya定理,多边形,给出n,m(nm),从单位正n边形的顶点中选出m个,能组成多少种不同的m多边形? 若一个m边形可由另一个m边形通过旋转、翻
25、转、平移得到,则认为两个m边形同种,分析,m=3时, 平移不可能发生重合, 因此只考虑翻转和旋转. 问题转化为用01两种颜色给n个点染色, m个染成1, n-m染成0,分析,还是染色问题, 但polya定理不适用, 因为要求染色格式为(m,n-m) 直接用Burnside引理求解, 需要计算每个置换的不动点数V 不动点: 每个循环内各元素颜色相同,分析,旋转. 考虑顺时针旋转i格的置换: 循环个数为gcd(n,i) 每个循环的长度为L=n/gcd(n,i) 枚举每个置换I 计算循环长度L. 如果L不是M的约数则无解(因为每个循环内的颜色相同) 否则问题转化为在所有个置换里选M/L个, V=c(
26、gcd(n,i), M/L)=c(N/L, M/L) 时间复杂度为O(n),分析,翻转, 考虑对称轴 n为奇数. 只有一种对称轴, 即轴穿过一个点. 有n/2个循环长度为2, 还有一个循环长度为1(被穿过的点), V=C(n/2, m/2). n为偶数, 有两种翻转 轴每边n/2个点. 这样的置换有n/2个 轴穿两点, 每边n/2个点. 这样的置换也有n/2个,分析,轴不穿点的情形, 有n/2个循环长度为2. 若m为偶数, 则V=C(n/2, m/2); 若m为奇数, 则V=0 轴穿两点, 每边n/2个点的情形, n/2-1个循环长度为2, 两个循环长度为1(被穿过的点) 若m为偶数, 则V=
27、C(n/2-1,m/2)+C(n/2-1,m/2-1)=C(n/2,m/2) (被穿点都选或者都不选) 若m为奇数, 则V=2C(n/2-1, (m-1)/2),分析,总结 不动点: 每个循环内颜色相同, 因此需要给每个循环安排一种颜色, 借助奇偶分析保证颜色为1的点数恰好为m 结论(虽然分类讨论多, 但容易合并!) 方法: 每类置换(n奇数只有一类)的V加起来 n为偶m为奇, sumV = nC(n/2-1, m/2) n为奇或n、m同为偶, sumV = nC(n/2, m/2) 时间复杂度为O(1)(不考虑高精度),分析,优化: 旋转时是否可以不枚举置换i? L=n/gcd(n,i)显然
28、是n的约数. 又因为L必须是M的约数, 因此L是gcd(n,m)的约数 枚举gcd(n,m)的约数L, 如何计算有多少个i满足L=n/gcd(n,i), 即gcd(n,i)=n/L=a?,分析,有多少个i满足gcd(n,i)=n/L=a? 设i=a*t, 则当且仅当gcd(L, t)=1时gcd(n,i)=gcd(a*L,a*t)=a 因为0=i=n, 所以0=t=n/a=L 结论:有phi(L)个i满足条件. 由于每个置换对应的不动点数都是C(N/L, M/L), 因此总数为sumphi(L)*C(N/L, M/L) 计算次数仅是gcd(N,M)的约数个数,五、递推法,互不攻击的象,两个“象
29、”互不攻击当且仅当它们不处于同一条斜线上。例如B1和B2互相攻击,但是B1和B3、B2和B3都不互相攻击。 在一个nn(n30)的棋盘上放k个互不攻击的象有多少种方法?例如,当n=8,k=6时有5 599 888种方法。,分析,白格象和黑格象互不相干, 抽白格得到左图 行顺序无关, 重排得右图 问题: 右图放t个象的方案数?,分析,dti,j表示第i行及下面的行放j个象的方案数 已经放了t-j个象, 每放一个象都会导致某列被禁止 设第i行有ci个格子 放: 有ci-(t-j)种选择, 转移到dti+1,j-1 不放: 转移到dti+1,j 因此dti,j = (ci-t+j)*dti+1,j-
30、1+dti+1,j 枚举白格象个数t, 把所有dt1,t*dk-t1,k-t加起来即可,带标号连通图计数,统计有n(=50)个顶点的连通图有多少个n=3时有四个不同的图 n=4时有38个图,分析,设f(n)为所求答案, g(n)为有n个顶点的非连通图, 则f(n)+g(n)=h(n)=2n(n-1)/2. g(n)可以这样计算: 先枚举1所在连通分量的情况. 假设共有k个点就有C(n-1,k-1)种集合. 确定集合后, 第一连通分量有f(k)种情况, 其他连通分量有h(n-k)种情况,因此答案是 g(n)=sumC(n-1,k-1)*f(k)*h(n-k), k=1n-1 状态有n个, 决策n
31、个, 时间复杂度为O(n2) 每次计算出g(n)时立刻需要算出f(n)和h(n),分析,f(n)=1,1,4,38,728,26704,1866256,251548592 h(n)=1,2,8,64,1024, 以f(5)为例. 显然h(n)=1,2,8,64,1024先算g(5) C(4,0)*f(1)*h(4)=1*1*64=64 C(4,1)*f(2)*h(3)=4*1*8=32 C(4,2)*f(3)*h(2)=6*4*2=48 C(4,3)*f(4)*h(1)=4*38*1=152 则f(5)=h(5)-g(5)=1024-64-32-48-152=728,串并联网络,这个题目要求你
32、统计串并联网络的数目。串并联网络有两个端点,一个叫源,一个叫汇。一个两端点串并联网络可以按以下方式递归定义 一条单独的边是串并联网络 如果G1和G2是串并联网络,那么把他们的源和汇并在一起也得到串并联网络(并联) 如果G1和G2是串并联网络,那么把G1的汇和G2的源并在一起也得到串并联网络(串联),串并联网络,注意在串并联网络中两个点之间可以有多条边,而且,把串联在一起的部分调换看作是同一种串并联网络,比如 这三种网络都认为是相同的。类似的,把并联部分调换也看作是同一种串并联网络,如 这三种网络也被认为是相同的。现在,给出一个N你应该计算有N条边的串并联网络的数目。比如,N=4, 15时有10
33、、1399068种串并联网络,分析,串并联网络是递归定义的,这使我们想到可以通过递推来解决这道题。但是对串联和并联部分进行交换都看作是同一种串并联网络,直接递推的话会有很多的重复 解决重复问题,最有力的手段之一就是通过序的概念。给同构的网络定一个序,我们只要序最大或最小的就可以达到去除重复的目的。 直接定义串并联网络的序,是比较麻烦的,所以我们先对串并联电路的表示方法进行一下改造,分析,最容易想到的递归表示 用1表示只有一条边的串并联网络 n个网络串联, 写成(G1, G2, , Gn) n个网络并联, 写成G1, G2, , Gn 两种括号是必须的吗? 如果最外层是串联, 那么从外面数奇数层
34、都应该是串联, 偶数层是并联. 因此不需要区分串联还是并联, 只需要用S()表示最外层为串联的, P()表示最外层为并联的即可. 这样还可消除(1, (1, 1)和(1, 1, 1)这样的重复,分析,序关系. 要求所有括号内的元素(1或者括号)按所含1从多到少排序。这样, (1, 1), 1, 1)就不能写成S(1, (1, 1), 1) 由于1个数相同的元素还是有可能有多个, 所以这样并没有完全排除重复 方案一: 细化序关系 方案二: 递推时消除重复 我们采取方案二,分析,显然S型网络和P型网络的个数是一样的. 只考虑S型网络. 依次设计各个串联元素(每个串联元素是单条边或者一个并联项).
35、由序关系, 应该按元素个数递增的顺序设计各个串联元素 dn,k 表示有n条边, 主括号第一个元素含1的个数不超过k的S型网络的数目, 则dn,n-1为边数为n的S型网络数目, dn,n=2*dn,n-1为问题的答案 dn,k=dn,k-1+dn-k,k吗? 当前项最多有k-1条边, dn,k-1 当前项恰好有k条边, dn-k,k,分析,dn,k=dn,k-1+dn-k,k是错误的! 因为我们没有规定1的个数相同时各项应如何排列, 只能穷举前多少个元素包含1的个数等于k 假设有i个元素恰好包含k个1, 那么这i个元素应该都是从边数为k的P型网络里选出来的, 可以重复. 有重复的组合数是C(i, dk,k-1+i-1), 故 dn,k=dn,k-1+sumQ(i) 其中Q(i)=C(dk,k-1+i-1,i)*dn-i*k,k-1, 表示i个元素恰好包含k个1时有多少个S型网络,分析,S型网络递推式 dn,k=dn,k-1+sumQ(i) 其中Q(i)=C(dk,k-1+i-1,i)*dn-i*k,k-1, 表示i个元素恰好包含k个1时有多少个S型网络 考虑划线部分, 需要考虑边界 d0,k = 1, dn,k = dn,n (nk) 状态O(n2)个, 决策O(n)个, 如果用C(n,m)=C(n-1,m-1)*n/m计算组合数, 时间复杂度为O(n3),