灰灰-325-326-327-2019中南大学计算机上机-走台阶(3)

2023-11-11

(1)n个台阶,一次走1阶或2阶,问走n阶有多少可能?

(1<=n<=1000 000)结果用1000 0000 7取模输出。

输入格式:

输入台阶数n

输出格式:

结果用1000 0000 7取模输出。

输入样例:

3

输出样例:

3
#include <iostream>
using namespace std;
int f(int n) {

	if(n == 1)
		return 1;
	if(n == 2)
		return 2;
	return f(n-1)+f(n-2);
}
int main() {
	int n;
	cin >> n;
	int ans = f(n);
	cout << ans;
	return 0;
}

(1)算法的基本思想:

斐波那契数列。

举例子:

当阶数为1时,跳法:1种,记为F(1)=1

当阶数为2时,跳法:2种,记为F(2)=2

当阶数为3时,跳法:3种,记为F(3)=3

当阶数为4时,跳法:5种,记为F(4)=5

当阶数为5时,跳法:8种,记为F(5)=8

当阶数为6时,跳法:13种,记为F(6)=13

当阶数为7时,跳法:21种,记为F(7)=21

……

不难看出,F(n)=F(n-1)+F(n-2)

但是这种递归方案,在效率上可能并不是很高。递归过程中,有太多重复的元素被重新进行计算。

已下对此算法再进行改进:

#include <iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	int f1=1;
	int f2=2;
	int fn;
	if(n==1)
		return f1;
	else if(n==2)
		return f2;
	else for (int i = 2; i < n; ++i) {
			fn = f1 + f2;
			f1 = f2;
			f2 = fn;
		}
	cout << fn;
	return 0;
}

这种方法把已经得到的数列中间相保存起来,在下次需要计算的时候先查找一下,如果前面计算过就不用再重复计算了。

(3)一个台阶总共有 n 级,蛤有能力一次跳到 n 阶台阶,也可以一 次跳 n-1 阶台阶,也可以跳 n-2 阶台阶……也可以跳 1 阶台阶。 

问蛤跳到 n 层台阶有多少种跳法?(n<=50) 

输入格式:

输入台阶数

输出格式:

输出种类数

输入样例:

3

输出样例:

4

(1)算法的基本思想:

用 F(n)表示?跳上 n 阶台阶的跳法数

如果按照定义,Fib(0)肯定需要为 0,否则没有意义。

我们设定 F(0) = 1;n = 0 是特殊情况,通过下面的分析会知道,令 F(0) = 1 很有好处。

ps. F(0)等于几都不影响我们解题,但是会影响我们下面的分析理解。 

 

当 n = 1 时, 只有一种跳法,即 1 阶跳:F(1) = 1; 

当 n = 2 时, 有两种跳的方式,一阶跳和二阶跳:F(2) = 2; 到这里为止,和普通跳台阶是一样的。

当 n = 3 时,有三种跳的方式,第一次跳出一阶后,对应 F(3-1)种跳法; 第一次跳出二阶后,对应 F(3-2)种跳法;第一次跳出三阶后,只有这一种跳法。 

F(3) = F(2) + F(1)+ 1 = F(2) + F(1) + F(0) = 4; 

当 n = 4 时,有四种方式:第一次跳出一阶,对应 F(4-1)种跳法;第一次跳出二阶,对应 F(4-2)种跳法;第一次跳出三阶,对应 F(4-3)种跳法;第一次跳出四阶,只有一种跳法。 

F(4) = F(4-1) + F(4-2) + F(4-3) + 1 = F(4-1) + F(4-2) + F(4-3) + F(4-4) 种跳法。 

当 n = n 时,共有 n 种跳的方式: 

第一次跳出一阶后,后面还有 F(n-1)中跳法; 

 .......................... 

第一次跳出 n 阶后,后面还有 F(n-n)中跳法。 

F(n)=F(n-1)+F(n-2)+F(n-3)+..........+F(n-n) =F(0)+F(1)+F(2)+.......+F(n-1)。 

 

通过上述分析,我们就得到了通项公式:                  

F(n) =  F(0)+F(1)+F(2)+.......+ F(n-2) + F(n-1) 

因此,有F(n-1)=F(0)+F(1)+F(2)+.......+F(n-2) 

两式相减得:F(n)-F(n-1) = F(n-1) 

F(n) = 2*F(n-1)     n >= 3 

这就是我们需要的递推公式:F(n) = 2*F(n-1)     n >= 3

以上可以看出:

若阶数大于0的话,青蛙跳的方法有2的n-1次方种。

 

稍等一下:

还有一种更清奇的脑回路:

每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用2^(n-1)种情况

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    long long n;
    cin >> n;
    long long res;
    if (n < 1)
        res = 0;
    else
    {
        res = pow(2, n - 1);
    }
    cout << res;
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

灰灰-325-326-327-2019中南大学计算机上机-走台阶(3) 的相关文章

随机推荐