码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-08 17:55:14      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:动态规划   跳台阶   推算规则   递归   实现   

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

    

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级,那么实现的思路是一样的,只需要把初始的几个值替换掉就可以了~



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

标签:动态规划   跳台阶   推算规则   递归   实现   

原文地址:http://blog.csdn.net/puqutogether/article/details/41804465

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!