你有一个由N个人组成的大家庭,分别为1岁、2岁、3岁、...、N岁。 你想拍下一张你们大家庭的照片。所有家庭成员都要排在同一排中。
“我是家庭的朋友,建议安排家庭成员如下:”
1. 1岁的家庭成员坐在行的左端。 2. 每两个相邻的家庭成员之间的年龄差不能超过2岁。
输入:整数N,1 ≤ N ≤ 55。
输出:摄影师可以拍摄的可能照片数量。
例子-> 输入:4,输出:4
与条件匹配的数组:
[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]
另一个例子:
输入:5,输出:6
与条件匹配的数组:
[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][1,3,2,4,5][1,3,5,4,2]
我用Ruby解决了这个问题,因为它是我选择的工具。首先生成每个排列,然后通过检查条件#1来过滤它们,确保数组的第一个条目等于1,这很快。其次,从左到右遍历每个数组,并确保每对之间的绝对值差不超过2,这很慢。
当N > 9时,我的实现会变得非常缓慢,因为它要排序300k个排列。从那里开始,所需的时间是二次的(我认为,还在弄清楚)。
我应该如何改善这种情况?我这里并不是在寻找代码示例,更多的是想法,哪种算法应该用于有效地对排列进行排序?我应该编写自己的排列吗(可能是的)。
沿着这些思路,我复制了QuickPerm的这个版本 https://dev59.com/jnE95IYBdhLWcg3wPrkI#2390969
在results << yield(a)
周围添加了一个条件,只选择以1开头的数组,但我不确定如何最好地实现之前提到的其余条件。
编辑
这是令人非常失望的解决方案。
我真的想找出如何生成排列,而不是表示可能正确排列数量的整数。
def number_of_possible_perms(n_persons)
array = []
array[0] = 0
array[1] = array[2] = 1
for i in 3..n_persons
array[i] = array[i-1] + array[i-3] + 1
end
return array[n_persons]
end