题目链接:变态跳台阶
文章目录
- 1 题目描述
- 2 题目分析
- 3 代码
- 3.1 动态规划算法
- 3.11 Java代码
- 3.12 C++代码
- 3.2 递归算法
- 3.21 Java代码
- 3.22 C++代码
- 3.3 直接求解 公式:f(n)=2^(n-1)^
- 3.31 Java代码
- 3.32 C++代码
- 4 总结
1 题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
2 题目分析
假设f(n)代表青蛙跳上n级台阶的方法数。那么由于一次可以跳1级,也可以跳2级…它也可以跳n级。所以f(n)=f(n-1)+f(n-2)+…+f(1)+f(0);其中f(0)=1;根据这个式子可以写动态规划的算法
由上述公式知道:
f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)
f(n-1)=f(n-2)+f(n-3)+...+f(1)+f(0)
将第二个式子合并到第一个式子得到:
f(n)=2*f(n-1); 根据这个式子可以写递归算法
又由上式知道:
f(n)=2*f(n-1)
f(n-1)=2*f(n-2)
.
.
.
f(2)=2*f(1)
得出:
f(n)=2n-1 根据这个式子可以直接求解。
下面我们就以上述三种方法写代码
3 代码
3.1 动态规划算法
3.11 Java代码
public class Solution {public int JumpFloorII(int target) {//动态规划// 不使用公式求解,采用动态规划if(target<=2)return target;int[] ret=new int[target+1];ret[0]=1;ret[1]=1;ret[2]=2;int i,j,tmp=0;for(i=3;i<=target;i++){for(j=0;j<i;j++){tmp+=ret[j];} ret[i]=tmp;tmp=0;}return ret[target];}
}
3.12 C++代码
class Solution {
public:int jumpFloorII(int number) {// 不使用公式求解,采用动态规划if(number==0)return 0;int ret[number+1];ret[0]=1;ret[1]=1;ret[2]=2;int i,j,tmp=0;for(i=3;i<=number;i++){for(j=0;j<i;j++){tmp+=ret[j];} ret[i]=tmp;tmp=0;}return ret[number];}
};
3.2 递归算法
3.21 Java代码
public class Solution {public int JumpFloorII(int target) {//采用递归求解 f(n)=2*f(n-1);if(target==0)return 0;if(target==1)return 1;return 2*JumpFloorII(target-1);}
}
3.22 C++代码
class Solution {
public:int jumpFloorII(int number){//采用递归求解 f(n)=2*f(n-1);if(number==0)return 0;if(number==1)return 1;return 2*jumpFloorII(number-1);}
};
3.3 直接求解 公式:f(n)=2(n-1)
3.31 Java代码
public class Solution {public int JumpFloorII(int target) {//采用公式求解 f(n)=2^(n-1)if(target==0)return 0;//return (int)pow(2,number-1); 直接返回这一句不要下面的代码也可以int ret=1;int i;for(i=1;i<target;i++)ret*=2;return ret;}
}
3.32 C++代码
class Solution {
public:int jumpFloorII(int number) {//采用公式求解 f(n)=2^(n-1)if(number==0)return 0;//return (int)pow(2,number-1);int ret=1;int i;for(i=1;i<number;i++)ret*=2;return ret;}
};
4 总结
理解上述公式的推导过程
探讨学习加:
个人qq:1126137994
个人微信:liu1126137994