变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:f(n)=f(n-1)+f(n-2)+f(n-3)+…+1;
f(n-1)=f(n-2)+f(n-3)+f(n-4)+…+1;
两式子相减得到f(n)=2f(n-1)
f(1)=1;
所以f(n)=2^n
public class Solution {
public int JumpFloorII(int target) {
int a=1;
if(target==1)
return 1;
else
for(int i=1;i<target;i++){
a=a*2;
}
return a;
}
}
其实相比上面的公式法我更喜欢直接的代码实现,因为个人把思路转化为代码的能不8太行,所以来多锻炼多刷题
import java.util.*;
public class Solution {
public int JumpFloorII(int target) {
if (target <= 2) {
return target;
}
int[] dp = new int[target + 1];
Arrays.fill(dp, 1); //初始化每一种都可以直接从 0 跳到 n
dp[0] = 0; //从 0 跳到 0 为 0 种,因为 n = 0,没法跳
for (int i = 2; i <= target; i++) {
for (int j = i - 1; j >= 1; j--) {
dp[i] += dp[j]; //第 n 个状态是由前 n - 1 种状态推导出来,就是累加!
}
}
return dp[target];
}
}
这种呢就是直接f(n)=f(n-1)+f(n-2)+…f(1)+1的代码实现
import java.util.*;
public class Solution {
public int JumpFloorII(int target) {
if(target<=2)
return target;
else{
int [] arr=new int[target+1];
Arrays.fill(arr,0);
arr[0]=0;
arr[1]=1;
for(int i=2;i<=target;i++){
for(int j=i-1;j>=1;j--)
{
arr[i]=arr[j]+arr[i];
}
arr[i]=arr[i]+1;
}
return arr[target];
}
}
}
修改了下,我觉得这才是f(n)=f(n-1)+f(n-2)+…+1的直接实现,上一个版本不够直接