蓝桥杯_1_秘密行动_动态规划

小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用。已知向上1高度消耗的时间为1,跳跃不消耗时间。由于事态紧急,小D想知道他最少需要多少时间到达顶层。

输入格式:
第一行包含一个整数n,代表楼的高度。
接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。

输出格式:
输出1行,包含一个整数,表示所需的最短时间。

样例输入:
5
3
5
1
8
4

样例输出:
1

数据规模和约定
对20%的数据,n<=10
对40%的数据,n<=100
对60%的数据,n<=5000
对100%的数据,n<=10000
—————————————————————————————————————————————

  • 这是一道可以用dp动态规划解的题
  • 分析:用二维数组或者两个一维数组来存储上一层的最少时间(为了更直观,用一维数组解答)
  • 有两个状态:1.该层是爬上来的 || 2.该层是跳上来的

—————————————————————————————————————————————
代码

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[] nums = new int[n];
		for (int i = 0; i < n; i++) {
			nums[i] = in.nextInt();
		}
		in.close();
		System.out.println(dp(nums));
	}

	public static int dp(int[] nums) {
		int n = nums.length;
		int[] jump = new int[n];// 储存该层是跳上来的最少时间
		int[] climb = new int[n];// 储存该层是爬上来的最少时间

		for (int i = 0; i < n; i++) {
			if (i < 2) {// 这个时候最少时间都是0
				jump[i] = 0;
				climb[i] = nums[i];
			} else {
				//因为不能连续使用跳,且可以使用跳一层或者二层,所以只能在climb里选爬上来的最少时间
				jump[i] = Math.min(climb[i - 1], climb[i - 2]);
				//爬不限制,什么时候用都可以,即在上一层爬完继续爬,或者上一层是跳上来的,这两个情况中选最优+本身层数
				climb[i] = Math.min(jump[i - 1], climb[i-1]) + nums[i];
			}
		}
		return Math.min(climb[n-1], jump[n-1]);
	}
}

如有帮助到你,可以点个赞,后续更新LQB新题解答

发布了1 篇原创文章 · 获赞 1 · 访问量 42
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览