Mengdong的技术博客

学习,记录,分享

导航

几道排列组合题的总结

来源:HDU递推求解专题练习(For Beginner)

2045: 令f(n)为n个方格的涂色方案数,易得f(1)=3,f(2)=6,f(3)=6。现考虑f(n+1)的情况,f(n+1)实际上是在n方格的涂法中再追加一格得出的,n方格的涂法可以分为两类:
 
1) 合法的(即计入f(n)中的涂法),在此情况下,由于第1格与第n格不同,而第n+1格必须与第1格、第n格都不同,因此对于每种确定的n格涂法,第n+1格只有一个选择,因此该情况下的n+1格涂法数为f(n)
2) 前n-1格合法(计入f(n-1)),第n格与第1格同色,此情况下,只要在第n+1格涂上与第1格不同的颜色(也必与第n格不同)即可构造合法的n+1格涂法。证明如下:前n-1格为合法涂法=>第n-1格与第1格颜色不同,第n格与第1格颜色相同=>第n格与第n-1格颜色不同,第n+1格与第n格颜色不同=>第n+1格与第1格颜色不同=>此涂法合法。这种情况一共有f(n-1)种(在每种前n-1格合法涂法后加一个和第1格颜色相同的格子即可构造出来),对于每种该情况下的涂法,第n+1格都有2种颜色可以选择,因此该情况下的n+1格涂法数为2*f(n-1)
综合1)2),可得递推公式f(n+1)=f(n)+2f(n-1) (n>3)
 
2047: 记N(n)为长度为n的、非O结尾的合法EOF串的数目,O(n)为长度为n的,以O结尾的合法EOF串的数目。显然有N(1)=2, O(1)=1. 对于N(n+1),可在N(n)及O(n)后添加E或F得到,因此有递推式N(n+1)=N(n)+O(n)。对于O(n+1),可在N(n)后添加O得到,因此有递推式O(n+1)=N(n),O(n+1)+N(n+1)即为长度为n+1的合法EOF串的总数。

2048: 令D(n,n)为n人都拿到别人字条的情况数,则可知D(n,n)/A(n,n)为此情况出现的概率。首先有D(2,2)=1(即[2,1]), D(3,3)=2([2,3,1]和[3,1,2])。观察D(4,4)的所有9种情况([2,1,4,3],[3,1,4,2],[4,1,2,3],[2,4,1,3],[3,4,1,2],[4,3,1,2],[2,3,4,1],[4,3,2,1],[3,4,2,1]),可以将这9种情况分为两组:
 
1) 在D(3,3)的所有情况后加入4,然后将4与前面的元素逐一调换,得出的每一种情况都不重复且属于D(4,4):[2,3,1,4]=>[4,3,1,2],[2,4,1,3],[2,3,4,1]; [3,1,2,4]=>[4,1,2,3],[3,4,2,1],[3,1,4,2]。该情况的数量为D(3,3)*3;推广开来,对于D(n+1,n+1),情况数为D(n,n)*n;
2) 对于所有的D(3,2)情况(3人中2人拿到别人字条,1人拿到自己字条),即[1,3,2],[3,2,1],[2,1,3]添加4后,将4与拿到自己字条的人交换位置,也可以生成合法情况:[1,3,2,4]=>[4,3,2,1]; [3,2,1,4]=>[3,4,1,2]; [2,1,3,4]=>[2,1,4,3]。接下来再考虑D(3,2)的计算,它实际上可以看作是在D(2,2)上直接添加一个人得到,此时3人分为AB两组:A组2人都没有拿到自己的字条,B组1人拿到自己字条。A组的构成方法有C(3,2)种(也可以构成B组C(3,1),这是等价的,因为C(m,n)=C(m,m-n))。A组的组内情况有D(2,2)种,因此一共有C(3,1)*D(2,2)=D(2,2)*3种,推广开来,对于D(n+1,n+1),情况数为D(n-1,n-1)*n
将情况1)和2)相加可得递推公式D(n+1,n+1)=(D(n,n)+D(n-1,n-1))*n,其中初始状态D(2,2)=1,D(3,3)=2. 数值较大,建议使用unsigned long long

2049: 令D(m,n)为m对中n对配对错误的情况数,首先根据2048中的解法可求得所有D(m,m) (m in (1,20])的值,现在的问题变为如何求D(m,n) (m>n)。首先将m人分为AB两组:A组为n对配对错误的,B组为m-n对配对正确的。AB两组的分组方案有C(m,n)种,而对于A组,组内情况有D(n,n)种,对于B组,组内情况数为1,因此D(m,n)=D(n,n)*C(m,n)
 
OJ刷题真心挺好玩的,可谓寓教于乐的算法学习方法…

posted on 2013-07-11 15:42  mdyang  阅读(271)  评论(0编辑  收藏  举报