错位排序
n个物品,每个物品都不在对应的位置上,即对于任意的i∈[1,n],均有第i个物品不在i位置上的方案数。
令dp[i]dp[i]dp[i]表示前i个物品的错排方案数,递推解决问题。
对于第n个物品,我们假设dp[1]−dp[n−1]dp[1]-dp[n-1]dp[1]−dp[n−1]都已经处理好了,那么这个物品会有两种情况:
1.前n-1个物品已经错排好了,那么这个物品只用和前面任意一个物品交换位置即可,即dp[n]=(n−1)∗dp[n−1]dp[n]=(n-1)*dp[n-1]dp[n]=(n−1)∗dp[n−1]
2.前n-1个物体有一个在自己的位置上,剩下n-2个物品错排好了,那就只能把第n个物品和那个在自己位置上的物品交换,即dp[n]=(n−1)∗dp[n−2]dp[n]=(n-1)*dp[n-2]dp[n]=(n−1)∗dp[n−2]
所以综上,dp[n]=(n−1)∗(dp[n−1]+dp[n−2])dp[n]=(n-1)*(dp[n-1]+dp[n-2])dp[n]=(n−1)∗(dp[n−1]+dp[n−2])
特殊数列
第一类斯特林数:
n个物体排成k个非空环的方案数
令所求的为dp[n][k]dp[n][k]dp[n][k],前面的都已经求好了。
那么有两种情况:
1.自己成一个环,那么之前有k-1个环:dp[n][k]=dp[n−1][k−1]dp[n][k]=dp[n-1][k-1]dp[n][k]=dp[n−1][k−1]
2.前面已经有k个环,只需要把这个物体加到前面的空位里面,因为前面有n-1个物体,所以有n-1个空位,
所以dp[n][k]=dp[n−1][k]∗(n−1)dp[n][k]=dp[n-1][k]*(n-1)dp[n][k]=dp[n−1][k]∗(n−1)
综合来看,dp[n][k]=(n−1)∗dp[n−1][k]+dp[n−1][k−1]dp[n][k]=(n-1)*dp[n-1][k]+dp[n-1][k-1]dp[n][k]=(n−1)∗dp[n−1][k]+dp[n−1][k−1]。
第二类斯特林数
将n个不同物体放在k个集合中的方案数
dp[n][k]dp[n][k]dp[n][k]为状态,同上,dp[i][j]=do[i−1][j−1]+dp[i−1][j]∗jdp[i][j]=do[i-1][j-1]+dp[i-1][j]*jdp[i][j]=do[i−1][j−1]+dp[i−1][j]∗j
卡特兰数及其应用
何为卡特兰数
引入例题:
如图,在一个4*4的网格中,我们从左下角走到右上角且不越过对角线的方案数是多少?
。
分析:我们不妨计算出总方案数,减去越过对角线的非法方案数
总方案数:c(2n,n)c(2n,n)c(2n,n)
下面我们来分析非法方案数:如上图,一条非法路线一定经过对角线上面某一个点,假设它第一次越过对角线的时候的那个点为x点(即上图的蓝红绿三线交点),做出绿线,然后将红线沿着绿线对称,得到的蓝线不妨看作是从(0,0)(0,0)(0,0)到(n−1,n+1)(n-1,n+1)(n−1,n+1)的一个方案数,而且对于每一个非法的路径,均有一条蓝线与之对应,所以,不合法方案数为c(2∗n,n−1)c(2*n,n-1)c(2∗n,n−1)。
所以说,卡特兰数的公式为f(n)=c(2∗n,n)−c(2∗n,n−1)f(n)=c(2*n,n)-c(2*n,n-1)f(n)=c(2∗n,n)−c(2∗n,n−1)。