有序排队问题

原题:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

 

分析:将12个人从矮到高排序,然后将1至6人做第一排,7至12人做第二排,这是一个基本组合。在此基础上,尝试从第一排和第二排各选一个互换并且重新排列,比如可以互换(6,7)、……、(6,11)、(5,7)……(5,11)等等然后重排;接着将互换名额增加至2……N/2,又可以得到不同的组合情况。

 

互换名额为1:第二排可以选择的位置有*标出,为*****1,即除了最后一个,其他位置的人都可以互换至第一排,依然使得排列要求满足,对于第一排的情况,应该是一个等价的逆问题,意味着如果第二排有n种不同的情况,则第一排也有n种,根据乘法原理,总的有n*n种

 

互换名额为2:对于第二排,我们需要选出2个人,可能的组合有*1*111、1**111、11**11、……等等,组合比较多的,不太容易一一例举,需要反过来思考哪些组合不行,比如111**1,如果把10、11换到第一排去,在第二高位上,第一排将是10,而第二排是9,违反规则。类似的1111**,也不行,从中可以发现一个规律,如果某个组合的某个后缀串中,1的个数小于*的个数,则不行(比如111**1的后缀串**1),则这个组合是无效的。

 

互换名额如果继续增加直至N/2,过程应该是类似的,得到的可行算法可以是:一,暴力枚举1<<6种二进制组合,找出其中符合规则的所有情况(任意后缀串1的个数需大于一半),然后,再按1的个数划分类别(反应了互换名额的类别),统计各个类别中有效的组合数,最后求所有类别组合数的平方和。二,宽度优先遍历,相对于暴力搜索,宽度优先搜索可以通过预判避免不必要的组合情况,效率更好些。

 

总人数12作为参数传入,附上实现,如有错误,欢迎勘误

 

1)暴力搜索

 

2)宽度优先搜索

 

【欢迎勘误】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值