文章目录
1、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
我们要跳上第 n 级台阶,要么从第 n−1级台阶跳一级上来,要么从第 n−2级台阶跳两级上来,令 f(n)表示从第一级台阶跳上第 n 级台阶有几种跳法。则有:
f(n)=f(n−1)+f(n−2)
先确定n=1,f(1)=1,n=2,f(2)=2,
f(3)=f(2)+f(1),f(4)=f(3)+f(2),
递归的方法
首先考虑递归,出口是n=1,或者n=2。返回f(1),f(2),其余的返回 f(n−1)+f(n−2)。
代码如下
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int JumpFloor(int num)
{
if (num == 1) return 1;
if (num == 2) return 2;
else return JumpFloor(num - 1) + JumpFloor(num - 2);
}
int main()
{
int num, jumpCount;
cin >> num;
jumpCount = JumpFloor(num);
cout << jumpCount << endl;
return 0;
}
动态规划的方法
还可以用动态规划(这估计是最简单的动态规划了),求出跳到1–n之间所有台阶的方法数
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int JumpFloor1(int num)
{
int result[1001];
result[1] = 1;
result[2] = 2;
for (int i = 3; i <= num; i++) {
result[i] = result[i - 1] + result[i - 2];
}
return result[num];
}
int main()
{
int num, jumpCount;
cin >> num;
jumpCount = JumpFloor1(num);
cout << jumpCount << endl;
return 0;
}
动态规划的节省空间版
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int JumpFloor2(int num)
{
int result[3];
result[0] = 1;
result[1] = 2;
for (int i = 3; i <= num; i++) {
result[2] = result[0] + result[1];
result[0] = result[1];
result[1] = result[2];
}
return result[2];
}
int main()
{
int num, jumpCount;
cin >> num;
jumpCount = JumpFloor2(num);
cout << jumpCount << endl;
return 0;
}
2、一只青蛙一次可以跳上1级台阶,也可以跳上2级,还可以跳3级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析一样,不细说了,公式如下
f(n)=f(n−1)+f(n−2)+f(n-3)
就用递推来写了,其他的自己一品就出来了。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int JumpFloor(int num)
{
if (num == 1) return 1;
if (num == 2) return 2;
if (num == 3) return 4;
else return JumpFloor(num - 1) + JumpFloor(num - 2) + JumpFloor(num - 3);
}
int main()
{
int num, jumpCount;
cin >> num;
jumpCount = JumpFloor(num);
cout << jumpCount << endl;
return 0;
}
3、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
有意思不,嘻嘻嘻,分析也是一样的,不过要递推一下。
要跳上第 n 级台阶,可以从第 n−1级台阶一次跳上来,也可以可以从第 n−2级台阶一次跳上来,也可以可以从第 n−3级台阶一次跳上来,…,也可以可以从第 1 级台阶一次跳上来。那么问题就很简单啦,同样的,令 f(n) 表示从第一级台阶跳上第 n 级台阶有几种跳法。则有如下公式:
f(n)=f(n−1)+f(n−2)+…+f(1)
同时,f(n−1) 也可以表示如下:
f(n−1)=f(n−2)+f(n−3)+…+f(1)
所以,由上面两个公式可知:
f(n)=2f(n−1)
那么,替换一哈,用n-1代替n,则有:
f(n-1)=2f(n-2)
所以
f(n)=21f(n−1)=22f(n-2)=23f(n−3)=…=2(n−1)f(n−(n−1))=2(n−1)f(1)
因为 f(1)=1,所以 f(n)=2(n−1)f(1)=2(n−1)。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int num, jumpCount;
cin >> num;
jumpCount = 1<<(num-1);
cout << jumpCount << endl;
return 0;
}