选择题
- 斐波那契数列的定义如下: F 1 = 1 , F 2 = 1 , F n = F n − 1 + F ( n − 2 ) ( n ≥ 3 ) F_1 = 1, F_2 = 1, F_n = F_{n - 1} + F_(n - 2) (n \ge 3) F1=1,F2=1,Fn=Fn−1+F(n−2)(n≥3)。如果用下面的函数计算斐波那契数列的第 n 项,则其时间复杂度为( )。
int F(int n){
if (n <= 2)
return 1;
else
return F(n - 1) + F(n - 2);
}
【解析】排除法,递归调用求斐波那契数列第 n n n项。该题的递归调用树为二叉树,调用次数即二叉树的结点个数。所以时间复杂度接近 O ( 2 n ) O(2^n) O(2n),因此排除 O ( 1 ) O(1) O(1)、 O ( n ) O(n) O(n)、 O ( n 2 ) O(n^2) O(n2)。
具体推导过程,可以参考这篇博文。
问题求解
- 现有一只青蛙,初始时在 n n n 号荷叶上。当它某一时刻在 k k k 号荷叶上时,下一时刻将等概率地随机跳到 1 , 2 , … , k 1, 2, …, k 1,2,…,k号荷叶之一上,直至跳到 1 1 1 号荷叶为止。当 n = 2 n = 2 n=2 时,平均一共跳 2 2 2 次;当 n = 3 n = 3 n=3 时,平均一共跳 2.5 2.5 2.5次。则当 n = 5 n = 5 n=5 时,平均一共跳()次。
【解析】
f(n)
表示从1
号荷叶跳到n
号荷叶的平均次数,那么:
- f ( 1 ) = 0 f(1) = 0 f(1)=0
- f ( 2 ) = 1 2 × ( f ( 1 ) + 1 ) + 1 2 × ( f ( 2 ) + 1 ) f(2) = \frac{1}{2}\times(f(1) + 1) + \frac{1}{2}\times(f(2) + 1) f(2)=21×(f(1)+1)+21×(f(2)+1)。 1 2 \frac{1}{2} 21的概率从
1
号荷叶跳1次过来, 1 2 \frac{1}{2} 21的概率从2
号荷叶跳1次过来, f ( 2 ) = 2 f(2)=2 f(2)=2。- f ( 3 ) = 1 3 × ( f ( 1 ) + 1 ) + 1 3 × ( f ( 2 ) + 1 ) + 1 3 × ( f ( 3 ) + 1 ) f(3) = \frac{1}{3}\times(f(1) + 1) + \frac{1}{3}\times(f(2) + 1)+ \frac{1}{3}\times(f(3) + 1) f(3)=31×(f(1)+1)+31×(f(2)+1)+31×(f(3)+1)。 1 3 \frac{1}{3} 31的概率从
1
号荷叶跳1次过来, 1 3 \frac{1}{3} 31的概率从2
号荷叶跳1次过来, 1 3 \frac{1}{3} 31的概率从3
号荷叶跳1次过来, f ( 3 ) = 5 2 f(3)=\frac{5}{2} f(3)=25。- f ( 4 ) = 1 4 × ( f ( 1 ) + 1 ) + 1 4 × ( f ( 2 ) + 1 ) + 1 4 × ( f ( 3 ) + 1 ) + 1 4 × ( f ( 4 ) + 1 ) f(4) = \frac{1}{4}\times(f(1) + 1) + \frac{1}{4}\times(f(2) + 1)+ \frac{1}{4}\times(f(3) + 1)+ \frac{1}{4}\times(f(4) + 1) f(4)=41×(f(1)+1)+41×(f(2)+1)+41×(f(3)+1)+41×(f(4)+1)。 1 4 \frac{1}{4} 41的概率从
1
号荷叶跳1次过来, 1 4 \frac{1}{4} 41的概率从2
号荷叶跳1次过来, 1 4 \frac{1}{4} 41的概率从3
号荷叶跳1次过来, 1 4 \frac{1}{4} 41的概率从4
号荷叶跳1次过来, f ( 4 ) = 17 6 f(4)=\frac{17}{6} f(4)=617。- f ( 5 ) = 1 5 × ( f ( 1 ) + 1 ) + 1 5 × ( f ( 2 ) + 1 ) + 1 5 × ( f ( 3 ) + 1 ) + 1 5 × ( f ( 4 ) + 1 ) + 1 5 × ( f ( 5 ) + 1 ) f(5) = \frac{1}{5}\times(f(1) + 1) + \frac{1}{5}\times(f(2) + 1)+ \frac{1}{5}\times(f(3) + 1)+ \frac{1}{5}\times(f(4) + 1)+ \frac{1}{5}\times(f(5) + 1) f(5)=51×(f(1)+1)+51×(f(2)+1)+51×(f(3)+1)+51×(f(4)+1)+51×(f(5)+1),所以 f ( 5 ) = 38 12 f(5) = \frac{38}{12} f(5)=1238。
阅读程序
#include <iostream>
#include <cstring>
using namespace std;
const int SIZE = 100;
int n, m, p, a[SIZE][SIZE], count;
void colour(int x, int y){
count++;
a[x][y] = 1;
if ((x > 1) && (a[x - 1][y] == 0)) colour(x - 1, y);
if ((y > 1) && (a[x][y - 1] == 0)) colour(x, y - 1);
if ((x < n) && (a[x + 1][y] == 0)) colour(x + 1, y);
if ((y < m) && (a[x][y + 1] == 0)) colour(x, y + 1);
}
int main(){
int i, j, x, y, ans;
memset(a, 0, sizeof(a));
cin>>n>>m>>p;
for (i = 1;i <= p;i++) {
cin>>x>>y;
a[x][y] = 1;
}
ans = 0;
for (i = 1;i <= n;i++)
for (j = 1;j <= m;j++)
if (a[i][j] == 0) {
count = 0;
colour(i, j);
if (ans < count)
ans = count;
}
cout<<ans<<endl;
return 0;
}
输入:
6 5 9
1 4
2 3
2 4
3 2
4 1
4 3
4 5
5 4
6 4
【解析】深度优先遍历,求连通块的大小。注意求到矩阵的第
m
列即可。