剑指offer10 . 高效率斐波那契数列,青蛙台阶问题,矩阵覆盖问题p74
long long fb(int n
) {
if (n
< 0) return -1;
int table
[2] = {0, 1};
if (n
< 2) return table
[n
];
long long pre1
= 1, pre2
= 0, fbn
= 0;
for (int i
= 2; i
<= n
; ++i
) {
fbn
= pre1
+ pre2
;
pre2
= pre1
;
pre1
= fbn
;
}
return fbn
;
}
青蛙跳台阶(只能跳1,2步)
设f(n)表示青蛙跳上n级台阶的跳法数。当只有一个台阶时, n = 1时, 只有1中跳法; n = 2时,有两种跳法;; 当n很大时,青蛙在最后一步跳到第n级台阶时,有两种情况: 一种是青蛙在第n-1个台阶跳一个台阶,那么青蛙完成前面n-1个台阶,就有f(n-1)种跳法,这是一个子问题。 另一种是青蛙在第n-2个台阶跳两个台阶到第n个台阶,那么青蛙完成前面n-2个台阶,就有f(n-2)种情况,这又是另外一个子问题。 两个子问题构成了最终问题的解,所以当n>=3时,青蛙就有f(n)=f(n-1)+f(n-2)种跳法。
扩展 :如果一次可以跳1,2,3…n 级的话 f(n) = 2的n-1次方 证明: f(n) = f(n-1) + f(n-2) + f(n-3) …+f(n-n) 方程1 f(n-1) = f(n-2) + f(n-3) + f(n-4) …+f(n-n) 方程2 方程1-2得 : f(n) – f(n-1) = f(n-1) f(n) = 2f(n-1) = 22*f(n-2)=…2的n-1次方
p79 页的矩阵覆盖也是同样的道理,不再赘述(注意n是初始几个值0,1,2的特判)