排列组合问题的一些整理

初步:加法原理和乘法原理

概念:

加法原理是分类计数原理,常用于排列组合中,具体是指:做一件事情,完成它有n类方式,第一类方式有M1种方法,第二类方式有M2种方法,……,第n类方式有Mn种方法,那么完成这件事情共有M1+M2+……+Mn种方法。
做一件事,完成它需要分成n个步骤,做第一 步有m1种不同的方法,做第二步有m2种不同的方法,……,做第n步有mn种不同的方法。那么完成这件事共有 N=m1×m2×m3×…×mn 种不同的方法。

这个感觉大家都知道(小学奥数就开始学了吧qwq),感觉没有什么好说的qwq

例题参照:AHOI2009 中国象棋

这个题因为和DP结合,状态设计比较难想。但是当我们用\(f[i][j][k]\)来表示到第i行,其中j列摆放了一个棋子,k列摆放了两个棋子之后,我们不难发现状态的转移就是其实就是加法原理和乘法原理的应用:
以下是核心代码:

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;
//这一行什么都不放
dp[i][j-1][k+1]=(dp[i][j-1][k+1]+j*dp[i-1][j][k])%mod;
//这一行在原先只有一个棋子的那一列放一个棋子
dp[i][j+1][k]=(dp[i][j+1][k]+(m-k-j)*dp[i-1][j][k])%mod;
//这一行在原先没有棋子的那一列放一个棋子
dp[i][j+2][k]=(dp[i][j+2][k]+(m-k-j)*(m-k-j-1)/2*dp[i-1][j][k])%mod;
//这一行在原先没有棋子的两列分别摆放一个棋子
dp[i][j][k+1]=(dp[i][j][k+1]+(m-k-j)*dp[i-1][j][k]*j)%mod;
//这一行在原先有一个棋子和没有棋子的两列分别放一个
dp[i][j-2][k+2]=(dp[i][j-2][k+2]+j*(j-1)/2*dp[i-1][j][k])%mod;
//这一行在原先有一个棋子的两列分别摆放一个棋子

加法原理和乘法原理的区别:

一个与分类有关,一个与分步有关;加法原理是 “分类完成”,乘法原理是 “分步完成”。

初识排列

定义

从\(n\)个不同元素中,任取\(m\)(m<=n,m与n均为自然数, 下同)个元素按照一定的顺序排成一列,叫做从\(n\)个不同元素中取出\(m\)个元素的一个排列;从\(n\)个不同元素中取出\(m\)(\(m<=n\))个元素的所有排列的个数,叫做从\(n\)个不同元素中取\(m\)个元素的排列数,用符号\(A_n^m\) 表示。

计算公式

\(A_n^m=\frac{n!}{(n-m)!}\)

常见问题

1、全排列问题
\(A_n^n=n(n-1)(n-2)...3\times 2\times 1=n!\)

2、部分排列
就是上面的计算公式qwq

初识组合

定义:

\(n\)个人中选\(m\)(\(m<=n\)) 个出来,不排队,不在乎顺序就是\(C_n^m\)。
它和排列有关系为:\(C_n^m\times A_m^m=C_n^m\times m!=A_m^n\)
(解释:因为要考虑顺序,选出来的那m个人还需要全排列)

公式:

1、\(C_m^n=\frac{m!}{n!\times (m-n)!}\)

2、\(C_m^n=C_m^{m-n}\)

3、\(C_m^n=C_{m-1}^n+C_{m-1}^{n-1}\)

4、\(C_m^{n+1}=\frac{C_m^{n}\times (m-n)}{n+1}\)

5、\(C_{m}^{0}+C_{m}^{1}+C_{m}^{2}+...+C_{m}^{m}=2^{m}\)

  • 对于第二个公式应该很好理解,就是反选,方案数量自然是一样的。这体现的是它良好的对称性。
  • 第三个公式平常用来递推。可以划分为子问题理解:为如果选第m个数,那么就是在n-1个数里面选择m-1个数,如果不选第m个数,就是在n-1个数里面选m个数。证明如下:

\(∵C_{m}^{n}=\frac{n!}{m!(n-m)!}\)

\(∵C_{m}^{n-1}=\frac{(n-1)!}{m!(n-m-1)!}\)

\(∴C_{m}^{n-1}=\frac{(n-1)!}{m!(n-m-1)!}=\frac{(n-1)!(n-m)}{m!(n-m)!}\)

\(∵C_{m-1}^{n-1}=\frac{(n-1)!}{(m-1)!(n-m)!}=\frac{(n-1)!m}{m!(n-m)!}\)

\(∴C_{m-1}^{n-1}+C_{m-1}^{n}\)

\(=\frac{(n-1)!m}{m!(n-m)!}+\frac{(n-1)!(n-m)}{m!(n-m)!}\)

\(=\frac{n!}{m!(n-m)!}\)

\(=C_m^n\)

  • 第四个公式很好证明(展开即可),这里介绍它的应用:(二项式展开)求\((a+b)^n\)展开式的各项系数。
    我们会想到杨辉三角进行预处理,但是也可以直接利用公式:
    \(C_n^{m+1}/C_n^m=\frac{n-m}{m+1}\)递推来解决。

有限的可重复元素的排列

假设现在有n个元素,对于第一类元素\(n_1\),有sum1个重复,第二类元素\(n_2\),有sum2个重复......第m类元素\(n_m\),有summ个重复,总方案数为:
\[\frac{n!}{sum_1!\times sum_2!\times ...\times sum_m!}\]

附上一张来自wikipedia的图帮助理解:

无限的可重复元素组合问题

上面讲解的是有限的可重复元素排列问题,下面讲无限的可重复元素排列问题(就是每个元素都可以用无限多次参与排列)

现在我们从m个元素中选择k个元素的,然后我们将这k个元素进行排序之后应该是这个样子:(设我们选择的数为编号为\(a_i\)

\(1<=a_1<=a_2<=......<=a_k<=m\)

那么现在我们将等于号消去:

\(1<=a_1<=a_2+1<=a_3+2<=......<=a_k+k-1<=m+k-1\)

现在我们设\(b_i=a_i+i-1\),那么很容易我们可以发现

\(1<=b_1<b_2<b_3<......<b_k<=n-k+1\)

那么现在问题就转换成了在\([1,n+k-1]\)中选择k个不重复的元素了,那么根据我们的组合公式,自然是\(C_{m+k-1}^k\)了qwq

同理还有求编号在1~n的元素中取k个元素,使得他们的编号不相邻。公式是一样的,证明也是一样的。

二项式

这里有一张来自wikipedia的图,我觉得特别棒

二项式的系数公式:
\((x+y)^n=C_n^0x^ny^0+C_n^1x^{n-1}y^1+......+C_n^nx^0y^n\)
(可以看到,其实也可以用杨辉三角表示)
综合起来就是

\((x+y)^n=\sum_{k=0}^n\times C_n^k\times x^{n-k}\times y^k\)

错排问题

错排就是诸如有1~n n个人,每个人按照1~n进行编号,现在要让他们排成一队,但是每个人不能在自己编号上的问题。

对于这个问题,luogu日报已经有专门的一期来进行详细的讲解~~
传送门——戳我~~

圆排

从n个不同元素中不重复地取出m(1≤m≤n)个元素在一个圆周上,叫做这n个不同元素的圆排列。如果一个m-圆排列旋转可以得到另一个m-圆排列,则认为这两个圆排列相同。

n个不同元素的m-圆排列个数N为:
\(A_n^m/m=\frac{n!}{(n-m)\times m}\)
特别地,当m=n时,n个不同元素作成的圆排列总数N为: \(N=(N-1)!\)

环上的染色问题

现在一个环被分成了n段,要求每一段上都涂上颜色。一共有k种不同的颜色,涂好之后两两相邻颜色不能相同。问有多少种涂色方案?

这个问题我们可以这样考虑:
第一种情况:如果我们把原先的环看作只有\(n-1\)段,进行涂色,那么就是子问题\(A_{n-1}\),而且因为现在两两相邻的一定颜色不同,所以这时候我们再添加一个的话就是乘上\(m-2\);
第二种情况:我们把原先的环看作\(n-2\)段,,这样的话转换成了\(A_{n-2}\)的子问题,然后我们随意将一段分为两段,这时候还差一段,在两个相同颜色中间插入一种颜色,自然是有\(m-1\)种选择方法。
递推公式整理如下:

\(A_n=(m-2)A_{n-1}+(m-1)A_{n-2}\)

这是一个二阶常系数递推式,推导之后通项公式如下:

\(A_n=(m-1)^n+(-1)^n\times (m-1)\)

例题参照:

NOIP2017 组合数问题 这个没什么好说的,就是杨辉三角

codeforces 991E 可重复元素的排列+搜索

HNOI2008 越狱
我们直接考虑不太方便,但是可以想到补集转换,算出来所有的方案数然后减去不合法的就很简单了qwq,之后就是快速幂的模板了qwq

nowcoder 选择颜色 环上的颜色选择问题,相邻要求不同色。

以上。。。蒟蒻做题少,欢迎各位dalao指教啦~~

原文地址:https://www.cnblogs.com/fengxunling/p/9687162.html

时间: 2024-10-11 16:57:53

排列组合问题的一些整理的相关文章

【程序员眼中的统计学(5)】排列组合:排序、排位、排

排列组合:排序.排位.排 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统

iOS多线程中,队列和执行的排列组合结果分析

本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到这边文章请 点击查看原文 提到多线程,也就是四种,pthread,NSthread,GCD,NSOperation 其中phtread是跨平台的.GCD和NSOperation都是常用的,后者是基于前者的. 但是两者区别:GCD的核心概念是将一个任务添加到队列,指定任务执行的方法,然后执行. NSO

【Java中 任意几个数字获取其所有的排列组合】

今天在工作中碰到一个问题,在java中输入比如1,2,3  三个数 我想要得到其所有的排列组合 比如 123,312,132,231,213,321 这些 上网找了找别人的算法,稍加整理,分享给大家代码如下 import java.util.Arrays;                        //用于数组输出. import java.util.LinkedList; import java.util.List; public class test { static String to

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最

排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看

hdu 1799 (循环多少次?)(排列组合公式)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3051    Accepted Submission(s): 1117 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

排列组合问题

一.不同元素子集问题 78. Subsets Given a set of distinct integers, nums, return all possible subsets. 给定一组非重复数字,求出所有可能的子集 解析: 例如 [1,2,3],解法: 首先放[],然后往已有的[]中放1 1. 首先放1 此时已有[ [], 1 ] 2. 然后对[ [], 1 ] 放2 于是此时有 [ [], [1], [2], [1,2] ] 3. 然后对[ [], [1], [2], [1,2] ]

排列组合问题之圆形分布

1.问题1.1 团团坐有一张圆桌,坐了A,B,C,D四个人,已知,D在A的右边,C在D的对面,请问A,B,C,D,的坐次? 解答:这个问题相对简单,我们纸上画一画,就能画出他们的可能的位置了 但是,可能还有一种解,比如我们把A,B,C,D依次右转一个位,也是满足条件的,而且只要保持他们的相对位置不变,依次右转n个位都是问题的解,而且还有个有趣的事情,当他们转了一圈(即右转4个位)后,他们右回到原位了 2.圆形分布上面这个问题就是一种圆形分布,那么他和直线分布的区别在哪里呢?又有什么联系呢?上面文

【noi 2.6_9288】&amp;【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度)

题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变形.(推荐阅读:http://www.cnblogs.com/chenhuan001/p/5157133.html).P.S.不知我之前自己推出的公式“C(n,m)*C(2*m,m)/(m+1)*P(n,n)*P(m,m)”是否是正确的. (1)在不考虑m人和n人本身组内的排列时,总方案数为C(m+