当前位置: 首页 > news >正文

排列木桩

原题

有N个木桩,高度分别为1到N。你现在要将木桩排列为一行,当你从左边看的时候,只看到L个木桩(因为,一些高的木桩会挡住矮的木桩);从右边看时,只看到R个木桩。给定N、L、R,你该如何排列木桩呢?

例1:N=3,L=2,R=1,可行的排列方案只有{2,1,3}。

例2:N=3,L=2,R=2,可行的排列方案有{1,3,2}{2,3,1}

分析

开始排列木桩的时候,应该如何选取第一根木桩呢?一个很直接的选择就是先确定最高的木桩的位置,也就是N。因为,无论从左到右,还是从右到左看,都要到最高停下来。

确定了最高的木桩之后,无论从哪一边看,都至少有一个木桩。接下来,该如何处理?想必大家已经想到了,开始递归呗。左右两边,也同样是先确定最高的木桩的位置,依次递归下去。

构造的方法,是比较简单地。但,往往这个时候面试题并没有结束。面试官,会进一步问:给定NLR,有多少种排列木桩的方法呢?从一个构造问题,转变为一个计数的问题。该如何做呢?方法仍旧是递归,我们尝试写出递归表达式。

假设,b(N,L,R)表示排列方案的总数。f(N, L)表示N个木桩,排列得到从左边能够看到L个木桩的方案总数。我们从f的递归形式入手分析。

首先,f(N,N)=1。从左到右,从低到高排列,只有一个方案。

然后,f(N,M)=0,当N< M时。显而易见。

其次,f(N,1)=(N-1)!。当只看到一个木桩的时候,即最高的木桩排在最左边,其他的木桩无论怎么排列都可以。

再次,假设最高的木桩放在从左边开始的第k个位置,则,我们要在剩下的N-1个木桩里面,选取k-1个木桩放在最高木桩的左边,并且,找到能看到L-1个木桩的方案数(因为最高的木桩一定能看见,所以是L-1个),此时剩下的N-K个木桩,可以任意排列,得到递归表达式如下:

f(N, L) = sum_{L<=k<=N} (N-1 选择 k-1) * f(k-1, L-1) * (N-k)!

这个式子,是仅仅考虑了总左边看到L个柱子的情况,再需要考虑,从右边看,有R根柱子的方案呢?其实很简单了,剩下的N-k个柱子,不要任意排列,要保证从右边能够看到R-1个柱子即可。所得递归式如下:

b(N,L,R) = sum_{L<=k<=N-R+1} (N-1 选择 k-1) * f(k-1, L-1) * f(N-k,R-1)

如何?并不是很难的题目,只要抓住从哪根木桩开始即可。

其实,这个题目从最矮的木桩开始,也可以写出漂亮、而且更简单递归表达式的。简单提示:

*何时能够看到最矮的木桩?*看到了如何?*看不到,又如何?

【分析完毕】

转载于:https://www.cnblogs.com/downtjs/p/3534988.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mysql 主从同步event问题
  • Angularjs之国际化
  • php面试相关
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • java经典面试题!
  • Bootstrap模态框的简单示例
  • 解决Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly
  • Linux下使用mke2fsk格式化虚拟磁盘分区的方法
  • ios KVOKVC
  • 开源入侵检测系统OSSEC搭建之二:客户端安装
  • Cisco设备型号编码详解
  • Android 通知栏自定义视图并且设置事件的开发
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • ubuntu 访问window
  • Java垃圾收集调优实战
  • 《剑指offer》分解让复杂问题更简单
  • 【译】理解JavaScript:new 关键字
  • 78. Subsets
  • ES6 学习笔记(一)let,const和解构赋值
  • Java 网络编程(2):UDP 的使用
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • 对象管理器(defineProperty)学习笔记
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 微信小程序填坑清单
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Java总结 - String - 这篇请使劲喷我
  • NLPIR智能语义技术让大数据挖掘更简单
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 阿里云移动端播放器高级功能介绍
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #if和#ifdef区别
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (a /b)*c的值
  • (差分)胡桃爱原石
  • (分布式缓存)Redis持久化
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (九十四)函数和二维数组
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (一)u-boot-nand.bin的下载
  • (转)linux 命令大全
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .net6使用Sejil可视化日志
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET微信公众号开发-2.0创建自定义菜单
  • @取消转义
  • [12] 使用 CUDA 进行图像处理
  • [20160807][系统设计的三次迭代]
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [C#]获取指定文件夹下的所有文件名(递归)