- 題目: 一隻青蛙一次可以跳一級臺階,也可以跳兩級臺階,求青蛙跳上一個n級臺階有多少種跳法。
- 解析: 利用動態規劃進行求解,首先介紹動態規劃解題三要素:
(1)定義數組元素的含義
首先定義dp[i]的含義,要求跳上n級臺階有多少種跳法,則跳上i級太極的跳法一共有dp[i]種跳法,這樣計算出dp[n]就可以得到答案。
(2)找出數組元素之間的含義
動態規劃的思想主要是,把一個規模比較大的問題分成幾個規模比較小的問題,然後由小問題推到出大問題。也就是說dp[n]的規模爲n,比它小的是n-1, n-2, n-3… 所以之間必定存在一種關係。如題,跳臺階有兩種方法,跳一級或者跳兩級,所以青蛙到達n級的臺階有兩種方式,一種是由n-1級臺階跳一級到達第n級,另一種爲由n-2級臺階跳兩級到達第n級,即所有可能的跳法爲dp[n] = dp[n - 1] + dp[n - 2]
。
(3)找出初試條件
當n=1時,dp[1] = dp[0] + dp[-1]
,顯然數組元素不能爲負數,所以對於dp[1]必須給出數值,dp[1] = 1
, 同樣,dp[0] = 0
;還有當n = 2時,dp[2] = dp[1] + dp[0] = 1
,實際,當有兩個臺階的話,有兩種方法,每次跳一級和一次跳兩級,即dp[2] = 2
。綜上,初始條件設置爲n <= 2
時,dp[n] = n
。
- 參考答案:
class solution{
public:
int JumpFloor(int n){
int dp[n];
if(n <= 1)
return n;
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i < n; i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};