青蛙跳台阶
1.题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上n级台阶共有多少种跳法?
2.思路
定义一个方法 frogJump
,它接受一个整数 n
作为参数,表示台阶的总数。我们的目标是找出青蛙跳上 n
级台阶有多少种不同的跳法。
3.代码
import java.util.Scanner;
public class 青蛙跳台阶 {
public static int frogJump(int n) {
int[] dp=new int[n+1];
//初始化基础情况
//跳上第1级台阶只有1种跳法
dp[1]=1;
//如果n大于1,则跳上第2级台阶有2种跳法
if(n>=2) {
dp[2]=2;
}
//通过动态规划填充dp数组
//从第3级台阶开始,每一级台阶的跳数是前两级台阶跳法数量之和
for(int i=3;i<=n;i++) {
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
System.out.println(frogJump(n));
}
}
4.学习要点
1)int[] dp = new int[n + 1];
我们创建一个大小为 n + 1
的整数数组 dp
。dp[i]
表示跳上 i
级台阶的跳法数量。数组的大小为 n + 1
是因为数组索引从0开始,而我们想要表示的是从1级到n级台阶的情况。
2)if (n >= 2) { dp[2] = 2; }
对于第2级台阶,青蛙有两种跳法:分两次跳1级或直接跳2级。因此,如果 n
大于或等于2,我们将 dp[2]
设置为2。
3)for (int i = 3; i <= n; i++) { ... }
这个循环从第3级台阶开始,一直到第 n
级台阶。对于每一级台阶 i
,我们计算到达该台阶的跳法数量,它是到达 i-1
级台阶和 i-2
级台阶的跳法数量之和。这是因为青蛙可以从 i-1
级台阶跳1级到达 i
,或者从 i-2
级台阶跳2级到达 i
。
4)dp[i] = dp[i - 1] + dp[i - 2];
这行代码是动态规划的核心。它计算了到达当前台阶 i
的所有可能跳法的数量
爬楼梯
该题和“青蛙跳台阶”是类似的,略微有些不同,直接附上代码
import java.util.Scanner;
public class 爬楼梯 {
public static int stair(int n) {
int[] dp= new int [n+1];
dp[1]=1;
if(n>=2) {
dp[2]=2;
}
for(int i=3;i<=n;i++) {
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
public static void main(String[] args) {
System.out.print("输入:n = ");
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();
System.out.println("输出:"+stair(n));
}
}