首先来重复一下问题(具体可以浏览thinke365的帖子http://www.iteye.com/topic/503191
)
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
我们可以从如下几个方面来分析这个问题:
a. 先把这12个高矮不同的人按身高递增的顺序排成1列,并依次从1到12编号来简化不同身高的表示方法;
b. 如果第一排的排列次序已确定的话,那么第二排的排列就自然确定;
c. 显然,如果只有编号为1和2的2个人的话,排列方式只有一种(1)(2);
d. 对于编号为1 - n的每一种符合条件的排列(n为偶数,并且假设第一排末尾的编号为x),在第一排加入n+1和在第二排加入n+2可以产生一种符合条件的编号为1 - (n+2)的排列;
e. 在d条件下,可以把新加入第一排的n+1替换成 大于x且小于n+1
的编号(即第一排新末尾的编号值x'的取值范围为大于x且小于等于n+1),因为这样的替换保证了新的第一排的排列都是从原来的第一排生成的(即第一排的前n/2个排列与原来的相同),而且在第二排中加入编号n+1后会使第二排的某个编号值变大(因为第二排中的n+2不会被换出)。显然,无论第二排中哪个编号变大,只要重新按编号递增排列第二排,
都会保证原来
的
第二排比对应的第一排的人高(即编号较大),而第二排末尾的编号n+2总是能够确保大于第一排的末位;
因此,我们可以根据以上分析来画出从 编号为1 - n的排列
到 编号为1 - (n+2)的排列
的状态转换树(n=2,4,6的情况):
以上状态转换树只画出了第一排的状态转换,对于第3层,它的n+1=5,n+2=6,显然n+2的值即为节点层序值的2倍
所以,求编号为1 - 12的排列总数,就是求该树的第6层的节点数,而从根节点1到第6层的每个节点的路径就是一个符合条件的第一排排列(可以用树的遍历算法求得)。
对于每个节点我们可以赋它的编号值为order和层序值为level,以下是简单计算第6层节点数的方法:
private void firstOrder(int order, int level) {
place.add(order);
if (level >= 6) {
count++;
place.pop();
return;
}
for (int i = order + 1; i < 2 * (level + 1); i++)
firstOrder(i, level + 1);
place.pop();
}
以下是计算并打印第一排排列的完整代码:
import java.util.Stack;
public class TwoOrderQueue {
private int count = 0;
private int total = 0;
private Stack<Integer> place = new Stack<Integer>();
public TwoOrderQueue(int total) {
this.total = total;
}
private void firstOrder(int order, int level) {
place.add(order);
if (level >= total / 2) {
//计数叶结点并打印路径
count++;
for (Integer i : place)
System.out.print(i + " ");
System.out.println();
place.pop();
return;
}
//展开编号为order的节点的子树,并进入下一层 level+1
for (int i = order + 1; i < 2 * (level + 1); i++)
firstOrder(i, level + 1);
place.pop();
}
public void firstOrder() {
firstOrder(1, 1);
System.out.println("第一排一共有" + count + "种排列");
}
public static void main(String[] args) {
TwoOrderQueue q = new TwoOrderQueue(12);
q.firstOrder();
}
}
小结:
我们把12个高矮不同的人按身高递增的顺序排成1列,并依次从1到12编号,这里面除了简化问题之外,还存在什么样的思维切入点呢?我们把12个人分为2列,这里隐含了一个“有序”的方法,即假设有2个空队列,12个人依次选择是进入第1个队列还是第2个队列,最后只要两队人数相同即可。显然,这12个人进入队列的次序是可以任意的,那么我们为什么不选择一种有序的次序呢?而最明显的一种有序的次序就属身高递增的次序了,把他们依次编号的话不仅可以区分不同的身高,还表示了依次进入队列的次序,这样就最容易在加入队列的过程中找出规律。
我们都知道,计算机最擅长的就是使用规则来求解规范的问题
。比如单纯形法,第一步就是要把线性方程组规范化,而这里问题最好的规范化就是问题分析中的a步骤。
使用排列组合的方法求解(参见thinke365帖子中BenArfa的解答):
如果要满足题意,只要从12个人中挑选6个人放在第一排,那么所有的人的位置就都确定了,因为是要求按身高排序的。
这里我们的挑选方法以及限制条件是这样的:12个人先从矮到高排序,然后每个人被选到第一排或者第二排,如果要满足题意,当且仅当每挑选完一次之后,第二排中的人数不多于第一排中的人数,而这个条件的排列就是 C(12,6) - C(12,5) = 132 ,但这样并不能求得具体的排列次序。
- 大小: 21.3 KB
分享到:
- 2009-11-21 16:44
- 浏览 1586
- 评论(0)
- 论坛回复 / 浏览 (0 / 4214)
- 查看更多
相关推荐
"阿里巴巴Redis使用规范" 本文将详细介绍阿里巴巴28条Redis使用规范,涵盖了Redis性能优化、数据存储、安全、实例管理等方面的内容。 规范一:控制key的长度 为了避免Redis中的keys过长,阿里巴巴建议控制key的...
阿里巴巴大数据实践之路 大数据是阿里巴巴的核心竞争力,阿里巴巴大数据实践之路是阿里巴巴数据事业部高级专家的经验总结。本文将从阿里巴巴的大数据发展历程、数据体系结构、公共技术平台、数据共享、算法共享、...
阿里巴巴前端开发规范.docx 阿里巴巴前端开发规范是阿里巴巴集团为了确保前端开发的质量和统一性而制定的规范。本规范涵盖了前端开发中的多个方面,包括命名规范、HTML 规范、CSS 规范等。 命名规范 命名规范是...
阿里巴巴大数据实践之路.pdf 阿里巴巴大数据实践之路概述 阿里巴巴是一家数据公司,经过多年的发展,阿里巴巴大数据实践之路可以分为三个阶段:Data 1.0、Data 2.0 和 Data 3.0。Data 1.0阶段,阿里巴巴主要关注...
阿里巴巴,作为距离大数据最近的公司之一,近几年对大数据却鲜有高谈阔论。实际上,阿里巴巴一开始就自然生长在数据的黑洞中,并且被越来越多、越来越密集的数据风暴裹挟。从需求→设计→迭代→升华为理论,在无数次...
### 浅析阿里巴巴集团人员流失问题及对策 #### 一、引言 随着中国经济的快速发展,企业也面临着前所未有的机遇与挑战。其中,人力资源管理成为决定企业能否持续发展的关键因素之一。人员流失作为企业管理中的一个...
阿里巴巴干部培训体系管理三板斧白皮书 阿里巴巴KPI考核方案 阿里巴巴的高绩效之道 阿里巴巴绩效管理培训 阿里巴巴绩效考核方案 阿里文化驱动的秘诀 标杆企业文化建设与实践 阿里组织变革理论与实践 阿里人才队员级...
标题中的“阿里巴巴面试题_身高排队问题”是一个典型的算法题目,常常出现在技术面试中,特别是像阿里巴巴这样的大型互联网公司的面试流程。这个问题旨在考察应聘者的逻辑思维能力、算法基础以及问题解决技巧。 ...
《阿里大数据之路:阿里巴巴大数据实践》是一本深入探讨阿里巴巴集团在大数据领域实践经验的书籍,共计339页,全面展示了阿里巴巴在大数据领域的技术积累和创新应用。这本书籍旨在分享阿里巴巴如何利用大数据技术来...
《阿里巴巴开发手册_阿里巴巴开发手册-泰山版》是阿里巴巴集团为Java开发者提供的一份详尽的编程规范和最佳实践指南。这份手册旨在提高代码质量、提升团队协作效率,并且遵循了阿里巴巴内部的一系列成熟开发标准。...
整理了一下阿里巴巴往届笔试面试题,希望对大家有帮助: 来源:阿里巴巴笔试面试圈>> 1、史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库 2、2018阿里软件工程师笔试题 3、2018秋招阿里巴巴java...
《阿里巴巴 Android 开发手册》是阿里巴巴集团各大 Android 开发团队的集体智慧结晶和经验总结,将淘宝、天猫、闲鱼、钉钉等 App 长期开发迭代和优化经验系统地整理成册,以指导 Android 开发者更加高效、高质量地...
阿里巴巴编码规范试题答案 一、Java多线程编程 1. Java中的定时任务可以使用哪些方式实现?(BCDA) 答案:Java中的定时任务可以使用Timer、ScheduledExecutorService、TimerTask等方式实现。Timer可以实现简单的...
互联网企业投资战略分析——以阿里巴巴为例.pdf互联网企业投资战略分析——以阿里巴巴为例.pdf互联网企业投资战略分析——以阿里巴巴为例.pdf互联网企业投资战略分析——以阿里巴巴为例.pdf互联网企业投资战略分析...
安装完成后,你需要获取阿里巴巴的Checkstyle配置文件,这通常可以在阿里巴巴开源项目的GitHub仓库中找到,如Alibaba Java Coding Guidelines。 1. **配置Checkstyle**: - 在Eclipse中,你可以通过Window -> ...
阿里巴巴java编码规范 ,Java 并发编程培训(阿里巴巴) 《阿里巴巴Java开发手册》,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大...
### 阿里巴巴在DevOps实践中的创新与思考 #### 一、引言 随着云计算、大数据等新技术的发展,软件开发与运维的融合成为趋势。DevOps作为连接开发与运维的重要桥梁,其实践也在不断演进和发展。阿里巴巴作为国内...
阿里巴巴组件库是一个专门为原型设计者打造的资源集合,它整合了阿里巴巴集团在UI设计和交互设计方面的最佳实践,旨在提高设计师的工作效率,确保产品的设计质量和一致性。这个组件库特别适用于使用Axure作为原型...