关键是要理解下文所说的,要求,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/48754087print('此处分割线————————————————————————————————————————’)
博客地址:
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时,退出循环。
