一个递推关系的解答
来源:互联网 发布:现代网络机顶盒说明书 编辑:程序博客网 时间:2024/05/04 05:23
题目:所有N位二进制序列中有多少个序列包含两个连续的‘1’?
解题过程:(注:其中有一个错误过程,是为了记录自己的错误思路,给自己看的,希望不要混淆读者)
由于前两天刚看过一个类似的题目的求解过程,立即便想到了通过在N-1序列的基础上添加一位二进制位的方式来推知答案。
设N位序列中包含两个连续‘1’的序列个数为M[N](N>=2)。
把N-1位的所有序列分为两部分:1、包含两个连续的‘1’。2、不包含两个连续的‘1’。
对于第一种情况是很容易理解的,如果N-1序列已经包含了两个连续的‘1’,则无论在结尾添加什么字符,所得到的序列还是符合要求的,而这样得到的序列有2M[N-1]个。
现在分析第二种情况。如果N-1序列不包含两个连续的‘1’,则很容易想到在结尾为‘1’的序列后再添加一个‘1’,就得到了想要的序列。那结尾为‘1’的N-1序列有多少个呢?
显然有2^(N-2)个,再减去其中包含两个连续‘1’的序列M[N-2]个。
则M[N] = 2M[N-1] + 2^(N-2)– M[N- 2].
这样得到的答案总比实际数字要多一些,说明公式有错。仔细观察推导过程,发现在分析第二种情况时有重复:结尾为‘1’的序列可能也在情况1里被统计过了,也就是说结尾为‘1’的序列本身可能就包含两个连续的‘1’。
毛病找到了,就对症下药。在结尾为“01”的且不包含两个连续的‘1’的序列后添加一个‘1’,就可以消除之前的重复统计现象。而这样的序列数与不包含两个连续‘1’的N-3的序列数是一致的。N-3序列共有2^(N-3)个,其中M[N-3]个包含“11”。
现在我们的答案是M[N]= 2M[N-1] + 2^(N-3) – M[N-3]。要得到完整的M,则需要初始化前三个元素:M[2] = 1, M[3] = 3, M[4] = 8。
其实通过另一个方向便很容易得到“不包含两个连续的‘1’的序列数”。其实就是斐波那契数列的一部分。可以表达为F[N] = F[N-1] + F[N-2]。用序列总数减去F[N]就得到了M[N],即:M[N] = 2^N – F[N]。
- 一个递推关系的解答
- 一个模糊的递推关系的证明
- 一种递推关系的变形
- 精确分析复杂的递推关系
- UVA11361 递推关系
- 递推关系
- POJ1850 递推关系
- poj1019 递推关系
- 对"一个非常难的查询问题(部门上下级的关系)"之解答的完善
- 对"一个非常难的查询问题(部门上下级的关系)"之解答的
- POJ 3252 递推关系
- 几个经典递推关系
- uva12034(递推关系)
- uva580(递推关系)
- uva11464(递推关系)
- 精确分析复杂的递推关系(改变初始值)
- 精确分析复杂的递推关系(多项式函数)
- URAL 1309 Dispute <函数关系的递推>
- 实例JavaScript代码
- 什么叫n+1次select查询问题?
- 自动实时监控alert log文件并发送email提醒
- 软件分享 usb device驱动
- 实现对IList到DataSet的转换
- 一个递推关系的解答
- Ubuntu git方法
- 内核编译时, 到底用make clean, make mrproper还是make distclean
- 强调实用主义——采访Python专家HyryStudio
- C++学习笔记之reinterpret_cast
- Event in ABAP report .
- 捷径心理
- Tomcat6.0相关
- 海量数据处理之分而治之/hash映射 + hash统计 + 堆/快速/归并排序