动态规划题目(二)——跳台阶
一个台阶总共有n 级,如果一次可以跳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; }
非递归方式也是一定要掌握的!
如果说这是一个斐波那契数列问题的话,那么非递归方式实现也就比较容易了~
如下:
#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