題目:
一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
解析:
首先看一下基本情況:
F(0)一定是0,
F(1)=1,
F(2)=2,
F(3)=4, (1+1+1;1+2;2+1;3)
F(4)=8, (1+1+1+1;1+1+2;1+2+1;2+1+1;1+3;3+1;2+2;4)
...
我們可以看出,F(4)=1+F(3)+F(2)+F(1),其中1代表從下面直接一次跳4個臺階的這種可能性,F(3)代表從初始到第三個臺階的所有可能性,在這種情況下可以一步從3階上到4階;同理,也可以一步從2階到4階,一步從1階到4階。
故而,可以推理出,F(n) = F(N-1)+F(N-2)+F(N-3)+...+F(2)+F(1)+1;
代碼:
public class Solution {
public int JumpFloorII(int target) {
if(target <0 ) return 0;
if(target <=2) return target;
int[] dp = new int[target+1];
dp[0]=0;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=target;i++){
dp[i]=1;
for(int j=i-1;j>0;j--){
dp[i]+=dp[j];
}
}
return dp[target];
}
}
這道題,關鍵就是把遞歸的公式找出來就好,不存在多少難度。
下面對于代碼的簡潔度上進行了優化:
import java.util.*;
public class Solution {
public int JumpFloorII(int target) {
int[] dp = new int[target+1];
Arrays.fill(dp,1); //把數組所有的初始值設為1
dp[0]=0; //除了dp[0]
for(int i=2;i<=target;i++){
for(int j=i-1;j>0;j--){
dp[i]+=dp[j];
}
}
return dp[target];
}
}