文章目錄
這兩題從動態規劃的角度思考,按照動態規劃的解題框架進行分析,非常的簡單和清晰。
跳臺階
1. 題意
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
2. 分析
2.1 確定狀態
2.1.1 最後一步
- 先不管前面是是如何跳躍的,最後一定會跳躍到
臺階n
- 根據題目的描述,青蛙只可能從
臺階n-1
或者臺階n-2
跳躍到臺階n
- 那麼如果我知道了有多少種跳法能跳到
臺階n-1
和臺階n-2
,那麼跳到臺階n
的跳法自然也就出來了,就是二者之和
2.1.2 子問題
- 原問題是求,有多少種跳法跳到
臺階n
- 現在要解決這個原問題,只需要知道有多少種跳法跳到
臺階n-1
和臺階n-2
- 問題不變,但問題規模變小了,那麼狀態也就定義出來了
f[i]
表示有幾種跳法能夠跳到臺階i
,最後返回f[n]
即是答案
2.2 狀態轉移方程
2.3 初始值和邊界條件
2.4 計算順序
- 時間複雜度:
O(n)
- 空間複雜度:
O(n)
,因爲只需要開一個長度爲n+1
的數組
3. 代碼
public int JumpFloor(int target) {
int[] f = new int[target + 1];
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= target ; i++) {
f[i] = f[i-1] + f[i-2];
}
return f[target];
}
變態跳臺階
1. 題意
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
2.分析
2.1 確定狀態
2.1.1 最後一步
- 與上題完全一樣,不管前面怎麼跳,最後一定能跳到
臺階n
- 根據題意,一隻青蛙可以跳上1級、2級…n級臺階
- 那麼最後一步跳到
臺階n
的就可能是臺階n-1
,臺階n-2...............臺階0
- 那麼我只需要知道跳到
臺階n-1、臺階n-2、.......、臺階0
各有多少種跳法,跳到臺階n
的跳法也就是他們之和
2.1.2 子問題
- 原問題是求,有多少種跳法跳到
臺階n
- 現在要解決這個原問題,只需要知道有多少種跳法跳到
臺階n-1、臺階n-2、.......臺階0
- 問題不變,但問題規模變小了,那麼狀態也就定義出來了
f[i]
表示有幾種跳法能夠跳到臺階i
,最後返回f[n]
即是答案
2.2 轉移方程
2.3 邊界條件和初始值
2.4 計算順序
- 同上
- 時間複雜度
3. 代碼
public int JumpFloorII(int target) {
int[] f = new int[target +1];
//0層不跳也是一種跳法
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= target ; i++) {
for (int j = i -1;j >= 0; j-- ){
f[i] += f[j];
}
}
return f[target];
}