刚开始用记忆化动态规划来做,比较简单,但是没有发现它的规律。
过完测试用例发现,我们求的f[n] = f[n-1]+f[n-2]+f[n-3]+... +f[0]
而f[n-1]=f[n-2]+f[n-3]+...+f[0]
所以f[n]正好等于2*f[n-1]
已知f[0] = f[1] = 1
所以容易得到f[2]=2,f[3]=4,f[4]=8 由此得到规律-->f[n]=2*(n-1)【n>=1】
public class Solution {
public int jumpFloorII(int target) {
//方法一 记忆动态规划
if(target<=1)
return 1;
int[] dp = new int[50];
for(int i=1;i<50;++i){
dp[i] = 1;
}
for(int i=2;i<=target;++i){
int index=1;
while(i-index>=0){
dp[i] += dp[i-index];
index++;
}
}
return dp[target];
//方法二 找规律
return (int)Math.pow(2,target-1);
}
}