斐波那契数列如何出现在 CodeChef 火与冰谜题的解决方案中?

How does the Fibonacci sequence arise in the solution to the CodeChef puzzle Fire and Ice?

有关原始问题陈述,请参阅 https://www.codechef.com/problems/FICE。问题归结为计算长度为 n >= 1 的二进制字符串的数量,其中每个连续的 运行 零或 1 具有奇数长度(即匹配正则表达式 (0(00)*|1(11)*)* 的字符串数量) .

为什么解等于 2 Fib(n),其中 Fib 表示斐波那契数列?

让我们写一个重复的答案。设 T0(n) 为以 0 结尾的有效字符串数,T1(n) 为以 1 结尾的有效字符串数。由于n >= 1,答案是T0(n) + T1(n)

我们可以找到一些基本案例。

T0(1) = 1, since there is one string of length one that ends with 0, i.e., 0
T0(2) = 1, since there is one string of length two that ends with 0, i.e., 10

现在让我们考虑 n >= 3T0(n)。给定一个长度为 n 并以 0 结尾的字符串,有两种情况,其中恰好有一种适用。第一种情况是字符串以 10 结尾,在这种情况下,删除 0 会得到长度为 n - 1 且以 1 结尾的有效字符串。第二种情况是字符串以 000 结尾,在这种情况下,删除 00 会得到长度为 n - 2 且以 0.

结尾的有效字符串
T0(n) = T0(n - 2) + T1(n - 1)

我们观察问题的对称性 T0(n) = T1(n).

T0(n) = T0(n - 2) + T0(n - 1)

这就是斐波那契递推。答案是T0(n) + T1(n) = 2 Fib(n).