N阶台阶问题(详解)
原创
问题描述:
有N阶台阶,每一步可以走1步台阶或者2步台阶,求出走到第N阶台阶的方法数。
解题思路:
- 类似于建立树的过程
1 2
1 2 1 2
1 2 1 2 1 2 1 2
…….. ........
如上,建立一棵根节点为1和一棵根节点为2的二叉树,分别表示台阶第一步跨1步和跨2步,
第二层各有两种选择,分别是跨1步和2步,接下来的每一层都有这两种选择,如何跨
越的阶数等于N,计数变量+1,如果大于N,返回继续走其他路径。
(由于n到45左右时数据已经爆炸,这种暴力递归法在n较大时系统出不来数据了)
#include<stdio.h> int count; //计数变量 void sos(int n,int step)
{
if(step>n) //大于n,这种方法不行
return;
if(step==n)
{
count++;
return;
} sos(n,step+); //树1
sos(n,step+); //树2
} int main()
{
int n;
scanf("%d",&n); //n阶台阶 sos(n,);
printf("%d",count);
return ;
}
2. 动态规划法
有一个规律: F(n)= F(n-1)+ F(n-2);
F(n)表示当有n阶台阶时有F(n)种方法;比如F(1)= 1;F(2)= 2;F(3)= F(1)+ F(2)= 3;
下面我用我的思路尽可能让大家理解这个公式:
1. 可以这样想,需要跨越n层阶梯,那么第一步我跨1层阶梯,那么剩下n-1层阶梯,跨越这n-1阶台阶的方法
就有F(n-1)方法; 同理,第一步跨2层阶梯,那么跨越剩下的n-2层阶梯就有F(n-2)种方法。
所以跨越n层阶梯的方法数 F(n)= F(n-1)+ F(n-2);
2. 如果上面大家不理解,还可以这样理解,假如我们已经知道了F(n-1)和F(n-2),求F(n);
在F(n-2)的基础上,我们可以通过一次跨2层阶梯到达第n层,也可以通过先跨1步,再跨1步的方式到达
第n层。 我们可以这样理解,如果一次性跨2层阶梯,我们只是在每一种跨越n-2层阶梯方式的基础上再加上
2就能到达第n层阶梯了,所以方法还是F(n-2);
如果先跨1步,这样加上原来的n-2步,就一共走了n-1步了,方法数就是F(n-1)了,然后再跨多1步,同
上,我们只是在每一种跨越n-1层阶梯方式的基础上再加上1就能到达第n层阶梯了,所以方法还是F(n-1)。
希望这样说大家能理解。
如有疑问和建议,非常欢迎大家发表评论。
#include<stdio.h>
#include<stdlib.h> int sos(long long *arr,int n)
{
if(n<)
return ;
if(n== || n== || n==)
return n; if(arr[n-]==) //等于0表示没有被算出
arr[n-]=sos(arr,n-); //没有被算出,就先算出 if(arr[n-]==) //同理
arr[n-]=sos(arr,n-); return arr[n-]+arr[n-]; //等到算出arr[n-1]和arr[n-2]后就可以算出arr[n]了
} int main()
{
int n;
scanf("%d",&n); //输入台阶数 long long *arr;
arr=(long long *)malloc(sizeof(long long)*(n+)); //分配n+1个空间 int i;
for(i=;i<=n;i++) //数组全部元素置0
arr[i]=; printf("%I64d",sos(arr,n)); free(arr);
return ;
}
2018-04-06
N阶台阶问题(详解)的更多相关文章
- 贝塞尔曲线 WPF MVVM N阶实现 公式详解+源代码下载
源代码下载 效果图: 本程序主要实现: N阶贝塞尔曲线(通用公式) 本程序主要使用技术 MVVM InterAction 事件绑定 动态添加Canvas的Item 第一部分公式: n=有效坐标点数量 ...
- React 高阶组价详解
这个教程还是不错的...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...
- EasyPR--开发详解(7)字符分割
大家好,好久不见了. 一转眼距离上一篇博客已经是4个月前的事了.要问博主这段时间去干了什么,我只能说:我去“外面看了看”. 图1 我想去看看 在外面跟几家创业公司谈了谈,交流了一些大数据与机器视觉相关 ...
- NetBios 的结构体详解
[NetBios 的结构体详解] NetBIOS是早期的局域网传输协议. 1.结构体. 2.命令 NetBIOS命令的使用方式有两种,即等待和非等待(或称为同步与异步)方式. 如果命令码的高阶位是0时 ...
- linux curl用法详解
linux curl用法详解 curl的应用方式,一是可以直接通过命令行工具,另一种是利用libcurl库做上层的开发.本篇主要总结一下命令行工具的http相关的应用, 尤其是http下载方面 ...
- 20160206.CCPP体系详解(0016天)
代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地 ...
- 20160128.CCPP体系详解(0007天)
以下内容有所摘取,进行了某些整理和补充 论浮点数的存储原理:float浮点数与double浮点数的二进制存储原理–>阶码 浮点数转二进制 1.整数int类型和浮点数float类型都是占用4个字节 ...
随机推荐
- SFTP环境搭建及客户代码调用公共方法封装
一.背景 在开发应用软件的过程中,广泛使用FTP在各子系统间传送文本数据.但FTP存在安全问题,开放到外网存在安全漏洞,容易被攻击.替换方案是使用SFTP,SFTP提供更高的安全性,当然传输的效率也会 ...
- js表单验证处理和childNodes 和children 的区别
一.对提交表单进行空值验证 html代码: <form action="#"onsubmit="return validate_form(this);" ...
- DaTaX当成jar包当作第三方库启动的相关问题
上一篇已经大致的将了本地状况下DaTaX的纯Java代码启动的过程 http://www.cnblogs.com/blogsofmy/p/8287637.html不了解的请点超链接 这次我们来说说文件 ...
- PAT乙级-1041. 考试座位号(15)
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...
- WordPress文章页添加展开/收缩功能
很多时候我们在WordPress上发布一些文章的时候里面都包含了很多的代码,我一般又不喜欢把代码压缩起来而喜欢让代码格式化显示,但是格式化显示通常会让文章内容看起来很多,不便于访问者浏览,所以今天就介 ...
- google提示恶意软件解决办法
对于没有安全经验的小白来说 google的一张图可能就会让吓得不轻(我会说我就是小白么~~) 就是这么一张图~ 其实解决办法很简单 google会向用户推荐几款比较不错的软件 进行检测 其中我认为比较 ...
- python全栈开发-Day4 列表
python全栈开发-Day4 列表 一.首先按照以下几个点展开列表的学习 #一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 ...
- 设计模式——命令模式(C++实现)
[root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp #include <iostream> #include <s ...
- python 全栈开发,Day2
python基础二(基础数据类型) 一.数据 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类 ...
- JAVA获取文件数据 ( xxxxx.json )
//路径fPixFile filePath = new File(fPix);System.out.print("文件路径:" + filePath);try { if (file ...