為把星際飛船送上天,SpaceX 猛造猛禽發動機
阿新 • • 發佈:2021-06-01
@
目錄- 1、一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
- 遞迴的方法
- 動態規劃的方法
- 動態規劃的節省空間版
- 2、一隻青蛙一次可以跳上1級臺階,也可以跳上2級,還可以跳3級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
- 3、一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法?
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;
}