灰灰-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) 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐