动态规划题目(二)——跳台阶

动态规划题目(二)——跳台阶

1. 题目描述

一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。

求总共有多少总跳法,并分析算法的时间复杂度。

2. 递归方式

对于这个动态规划问题,我们一样分两步来想:

  • 假如我们跳了1级,那么剩下的跳法就是f(n-1);
  • 假如我们跳了2级,那么剩下的跳法就是f(n-2);

这个时候我们就可以递归实现了,慢!我们还需要跳出递归的条件,这个也是必不可少的!

这个题目而言,跳出递归的条件是当n==1, 2的时候,我们返回1, 2。

为什么是1,2呢?因为当n=1时,只有一种跳法;当n=2时,有两种跳法。然后有了初始值,而且只有两种情况(要么跳1级,要么跳2级),原来这就是一个斐波那契数列问题!

代码如下:

#include<iostream>
using namespace std; 

int findSolution(int N)
{
	int result[3]={0, 1, 2};   //初始情况

	if(N<=2)
		return result[N]; 

	return findSolution(N-1)+findSolution(N-2);   //递归实现
}

int main()
{
	int N=20; 

	int num=findSolution(N); 

	cout<<num<<endl;

	return 0;
}

3. 非递归方式

非递归方式也是一定要掌握的!

如果说这是一个斐波那契数列问题的话,那么非递归方式实现也就比较容易了~

如下:

#include<iostream>
using namespace std; 

int findSolution(int N)
{
	int Fab[3]={1,1};
	if(N<2)
		return 1; 

	for(int i=2; i<=N; i++)
	{
		Fab[2]=Fab[0]+Fab[1];   //这里需要注意推算规则
		Fab[0]=Fab[1];
		Fab[1]=Fab[2];
	}
	return Fab[2];
}

int main()
{
	int N=20; 

	int num=findSolution(N); 

	cout<<num<<endl;

	return 0;
}

需要指出的是,这道题目的非递归方式的推算规则比较好想,当时之前《动态规划(一)》篇中的就不是很好想,大家以后一定要注意不同题目的推算规则!

另外,如果能够跳3级,那么实现的思路是一样的,只需要把初始的几个值替换掉就可以了~

时间: 2024-11-03 13:10:13

动态规划题目(二)——跳台阶的相关文章

《剑指Offer》题目:跳台阶

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 题目分析:这其实就是斐波拉契数列,递归的思想,用递推来实现,防止栈溢出. public class JumpFloor { public static int jumpFloor(int target) { int res[] = new int[2]; res[0]=1; res[1]=2; // 与前面的题只有初始值不一样 int temp = 0; if(target==0) return

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调用的层级太多,就会超出栈容量. 循环:通过设置计算的初始值及终止条件,在一个范围内重复运算. 斐波拉契数列 题目一:写一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项,定义如下: 第一种解法:用递归的算法: long long Fabonacci(unsigned int n) { i

[SinGuLaRiTy] 动态规划题目复习

[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲

Python算法题(一)——青蛙跳台阶

题目一(青蛙跳台阶): 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设只有一级台阶,则总共只有一种跳法: 假设有两级台阶,则总共有两种跳法: 假设有n级台阶,那么第一步就要分为跳一步和跳两步: 跳一步,那么接下来就是跳n-1: 跳两步,那么接下来就是跳n-2: 所以,总数可以认为是f(n-1)+f(n-2). 主要代码: def frog(num): if num <= 2: return num t1, t2 = 1, 2 for _

动态规划题目

动态规划算法,在T大某位老师的书中说就是递推+重复子问题. 动态规划算法的效率主要与重复子问题的处理有关. 典型的题目有 陪审团,最大公共子串问题 1,最大公共子串问题 这个是动态规划的基础题目.动态规划就是递推和重复子结构. 确定了递推关系后.找到一个能极大地减少重复运算的子结构至关重要.选的好了,时间效率会很好. 这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m.那么最长的子序列长度为f(n,m) 当a[n]=a[m]时 f(n,m)=1+f(n-1,m-1) 否则f(n,m)=

跳台阶问题

给定一个有N个台阶的楼梯,一个人从下到上开始跳台阶,这个人有两种跳的方式:一次跳一个台阶,一次跳两个台阶: 问:从台阶底端跳到台阶顶端,有多少种跳台阶的方式? 解法一:递归法 分析: 首先我们考虑最简单的情况.如果只有1个台阶,那么显然只有一种跳法:如果是2级台阶,那么有2种跳法.对于一个有n级台阶的楼梯来说,我们设跳法为 f(n) ,假如我们先跳1个台阶,则剩下有 n-1 个台阶,跳法为 f(n-1) 次,假如我们先跳2个台阶,则剩下 n-2 阶,跳法为 f(n-2):由此可以推出,对于一个n

剑指OFFER之变态跳台阶(九度OJ1389)

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 6 样例输出: 32 解题思路: 这道题目跟之前的跳台阶大同小异,只是跳台阶的阶数从1变到了n,也就是说,不再是跳一下或者跳两下的问题,而是跳n下的问题.那么解题的思路显然还得逆向分析,我们

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

跳台阶问题-java

跳台阶问题 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解析 这个问题归根结底还是一个费布拉奇数列,仔细找一下规律即可,刚开始做的时候我是直接写出前六个数的结果来找规律的. 一级台阶:1种 fib(1)=1 二级台阶:2种 fib(2)=2 三级台阶:3种 fib(3)=fib(1)+fib(2)=3 四级台阶:5种 fib(4)=fib(2)+fib(3)=5 五级台阶:8种 fib(5)=fib(3)+fib(4)=8 六级台阶:1