有这样一个题,貌似是阿里巴巴的笔试题?
提:12个高矮不一的人排成两排。要求:
1)每排从矮到高排
2)第二排的比第一排对应位置的人要高。
问:有多少种组合方式?
/
分析:
这是一个排列组合题,我们假设1~12是这12位置的编号。
第二排: 7 8 9 10 11 12
第一排: 1 2 3 4 5 6,位置2的人比位置1的人要高,但比位置8的人要矮,和位置7的人的高矮关系不定,以此类推。
可以这样考虑:这12人按从低到高站队,没人发一个编号,然后按此编号去站队,符合条件的编号发放组合就是答案。
下面解答:
1)首先可以确定最矮的和最高的人的编号一定是1和12,每种组合都是这样(可推理)。然后让拿到1,12,7,8,9,10,11编号的7人按从低到高排,肯定是 1 7 8 9 10 11 12这个顺序。
2)接下来确定2 3 4 5 6 五人的高低关系。首先高低关系肯定是 2 3 4 5 6,然后:
2比1高,比8低,则可排在1和8间,有两个位置,1-7,7-8,
3比2高,比9低,则可排在1和9间,有三个位置,1-7,7-8,8-9,但必须排在2后,这样,如下:
1 7 8 9 10 11 12
2 ^ ^
3 ^ ^ ^
4 ^ ^ ^ ^
5 ^ ^ ^ ^ ^
6 ^ ^ ^ ^ ^ ^
^代表该编号可插入的位置。比如都可以插在1-7,要注意2 3 4 5 6的先后顺序是确定的。
3)计算
1 7 8 9 10 11 12
2 ^1 ^1
我们加个数字代表这种插入方式的数量
再看:
1 7 8 9 10 11 12
2 ^1 ^1
3 ^1 ^2 ^2
当 n = 3 时,1-7的方式只有一种,即当2也插在1-7,因为2要插在7-8的话3就不可能插在1-7了。
7-8的方式有两种,2插在1-7,或者2插在7-8,
8-9的方式有两种,2插在1-7,或者2插在7-8,
插入方式数量Xn(0) =1 ;
Xn(k) = Xn-1(0)+Xn-1(1)+...+Xn-1(k); (k>0)
也即Xn(k) = Xn(k-1)+Xn-1(k);(k>0)
是递归的过程,由此我们得:
1 7 8 9 10 11 12
2 ^1 ^1
3 ^1 ^2 ^2
4 ^1 ^3 ^5 ^5
5 ^1 ^4 ^9 ^14 ^14
6 ^1 ^5 ^14 ^28 ^42 ^42
故问题的答案Y6 = X6(0)+X6(1)+...+X6(5) = 132
在编码实现的时候用递归还是顺序计算,要看需求。递归会出现重复计算,但是单个计算每次内存开销较小。顺序往下先算出各个元素的值,无需重复,以空间换时间。最好的方法是我们可以存储一部分元素值,比如第一列和第二列的值都很有规律,Xn(0) = 1, Xn(1) = n-1会使计算更快。同时内存占用也不会过大。在递归里可以判断Xn(k),k=0 => Xn(k) = 1,k=1 =>Xn(k) = n-1;
另外,当k>n-1时,Xn(k) = 0,即右上角的元素。
当然,在实际使用时,可以设置检查点,比如要算n=1002时,如果有n=1000的检查点可查,那么n=1002的计算就唾手可得了。