【笔试算法题】买票找零问题,及引申的递归问题

关键是要理解下文所说的,要求,0的累加个数大于1的累加个数.他们是一一对应的关系,从左到右扫描对应。

参考博客:
https://blog.csdn.net/fangjian1204/article/details/38536963


来自博客:https://bbs.csdn.net/topics/320099239
问题描述:
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
这个笔试题,很YD,因为把某个递归关系隐藏得很深.


问题转换为,这样的满足条件的01序列有多少个.
观察1的出现,我们考虑这一个出现能不能放在第二排,显然,在这个1之前出现的那些0,1对应的人
要么是在这个1左边,要么是在这个1前面.而肯定要有一个0的,在这个1前面,统计在这个1之前的0和1的个数.
也就是要求,0的个数大于1的个数.
对于每个1,1前面的0的个数,要大于1的个数,关系才成立。因为,对应的后面的数要比前面的数大,0比1多,可以满足出现一个1,就去对应他前面的0,这样肯定是后面的数比前面的数大了。


在<<计算机程序设计艺术>>,第三版,Donald E.Knuth著,苏运霖译,第一卷,508页,给出了证明:
问题大意是用S表示入栈,X表示出栈,那么合法的序列有多少个(S的个数为n)
显然有c(2n, n)个含S,X各n个的序列,剩下的是计算不允许的序列数(它包含正确个数的S和X,但是违背其它条件).
博客:https://www.cnblogs.com/Azhu/articles/2436321.html

问题等价于:n个1和n个0组成一2n位的2进制数,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少?

  解答: 设P2n为这样所得的数的个数。在2n位上填入n个1的方案数为 C(n 2n)

  不填1的其余n位自动填以数0。从C(n 2n)中减去不符合要求的方案数即为所求。

  不合要求的数指的是从左而右扫描,出现0的累计数超过1的累计数的数。

  不合要求的数的特征是从左而右扫描时,必然在某一奇数2m+1位上首先出现m+1个0的累计数,和m个1的累计数。

  此 后的2(n-m)-1位上有n-m个1,n-m-1个0。如若把后面这部分2(n-m)-1位,0与1交换,使之成为n-m个0,n-m-1个1,结果得 1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n-1个1和n+1个0组成的一个排列。

  反过来,任何一个 由n+1个0,n-1个1组成的2n位数,由于0的个数多2个,2n是偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面的部分,令0 和1互换,使之成为由n个0和n个1组成的2n位数。即n+1个0和n-1个1组成的2n位数,必对应于一个不合要求的数。

 

   用上述方法建立了由n+1个0和n-1个1组成的2n位数,与由n个0和n个1组成的2n位数中从左向右扫描出现0的累计数超过1的累计数的数一一对应。
     不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应
因此,序列的个数是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1)

LEETCODE上题目的解法:
https://blog.csdn.net/fly_yr/article/details/48754087

print('此处分割线————————————————————————————————————————’)

Python 实现递归算法

博客地址:

https://blog.csdn.net/SeeTheWorld518/article/details/47957183


2.2汉诺塔问题

见知乎 https://www.zhihu.com/question/37152936

参考博客 https://blog.csdn.net/hikobe8/article/details/50479669






最长子数组问题、递归动态规划问题

博客地址:https://blog.csdn.net/s969966195/article/details/75905362

解析:在f和s之间循环,当i==j时,退出循环。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值