动态规划-简单举例-青蛙跳台阶

青蛙跳台阶

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 的整数数组 dpdp[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));
	}
}

你可能感兴趣的:(动态规划,算法)