题目
(阿里)12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高。问排列方式有多少终?
解法
假设12个人从矮到高依次从0到11进行编号,(i,j)表示一个人在排队中的位置,那么(0, 0)位置一定是0号(最矮的),然后放置1号,1号可以放在(0,1)或(1,0)的位置。如下:
0 1 2 3 4 5
0 0 1
1
0 1 2 3 4 5
0 0
1 1
那么2号的位置会取绝与1号的位置,如果1号在(0,1),那么2号在第1排(0,2)或者第二排(1,0)都可以。但如果1号在(1,0)的位置,那么2号只能放到第一排(0,1),因为如果这时2号放置到第二排(1,1)时,那么3号将无处放置。
0 1 2 3 4 5
0 0 1 // 2的位置可以有两个
1 2
0 1 2 3 4 5
0 0 1 2
1
0 1 2 3 4 5
0 0 2
1 1
0 1 2 3 4 5
0 0
1 1 2 // 3将无处放置
因此有如下规律:对于i号,如果第一排和第二排的人数一样的话,那么它只能放置到第2排,如果第一排的人数多于第二排时,那么他可以放置到第1排或者第2排。这样的话,可以使用递归进行求解,分别使用两个变量对第一排和第二排的人数进行计数。
staic total_num = 0;
LINE-UP(int firstcount, int secondcount, int num):
if firstcount == num/2 or secondcount = num/2:
total_num++;
return;
if firstcount == secondcount:
LINE-UP(firstcount + 1, secondcount, num);
else
LINE-UP(firstcount + 1, secondcount, num);
LINE-UP(firstcount, secondcount + 1, num);
TEST-FUNCTION():
LINE-UP(0, 0, 12);