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个字节 ...
随机推荐
- ubuntu14.04上面安装ia32-libs
sudo -i cd /etc/apt/sources.list.d echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main ...
- weblogic的使用
1.怎么修改weblogic的端口 创建好域之后,去域的下面找到config.xml文件,在里面加上<listen-port>80</listen-port>即可,访问时不用加 ...
- CSS备战春招の二
CSS:层叠样式表 CSS注释形式:/* */ class 选择器有别于id选择器,class可以在多个元素中使用 id属性不要以数字开头,以数字开头在特定浏览器中不起作用 类名的第一个字符不要使用 ...
- Spark2.1.0官方文档
Spark 概述 Apache Spark是一个快速和通用的集群计算系统.它提供Java,scala,Python.R语言的APIs,以及支持一般执行图形的优化引擎. 它还支持一组丰富的高级工具,包括 ...
- Unity如何管理住Android 6.0 调皮的权限
前天我们项目有这么个需求,台湾版本由于要上谷歌Play要求安卓系统6.0以上的动态申请权限,对于一个做Unity的来说,是不是有点懵逼,这我该何去何从呢?我想静静,静静的想一想,权限也不就那么点事吗? ...
- 01背包问题(Java实现)
关于背包问题,百度文库上有崔添翼大神的<背包九讲>,不明的请移步查看.这里仅介绍最基本的01背包问题的实现. public class Knapsack { private final i ...
- Golang的CSP很酷?其实.NET也可以轻松完成
说起Golang(后面统称为Go),就想到他的高并发特性,在深入一些就是 Goroutine.在大家被它优雅的语法和简洁的代码实现的高并发程序所折服时,其实C#/.NET也可以很容易的做到.今天我们来 ...
- EasyUI 二次加载toolbar异常问题解决
问题:easyUI初次渲染正常,之后会出问题,toolbar重复加载 解决办法:每次加载之前先从body中删除已经渲染的工具栏-->重新加载-->手动渲染工具栏 代码: function ...
- 使用MBROSTool 工具制作U盘多启动盘的方法总结
前段时间写了一个自用五合一多启动盘分享--分别用来维护娱乐,wifi密码破解,win&mac登陆密码绕过/清除,反馈的同学还是挺多,觉得大家都有这方面的需求,于是再把自己的使用经验总结一下. ...
- WordPress后台添加友情链接管理功能
其实很早之前WordPress是有这个功能的,但是伴随着wordpress的经常升级和主题的升级以及更换,有时候后台会发现没有链接管理的入口,不过还是可以通过代码还原这个功能. 将以下代码添加到您当前 ...