问题描述
小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用。已知向上1高度消耗的时间为1,跳跃不消耗时间。由于事态紧急,小D想知道他最少需要多少时间到达顶层。
输入格式
第一行包含一个整数n,代表楼的高度。
接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。
接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。
输出格式
输出1行,包含一个整数,表示所需的最短时间。
样例输入
5
3
5
1
8
4
3
5
1
8
4
样例输出
1
一开始看到这道题目时,脑子就是时间从0开始算起,加起,但是会发现,这样并不好做,而且要考虑多种多样的情况;
后来有想到倒着DP,就是从最上层开始,类似于迷宫题目,倒着找最短路径,但是这样子,会涉及到 比较很多数 的情况;
于是乎就正着做,时间从最多的开始,也就是全部加起来的时间,然后逐渐减掉时间。
1 public class Main {
2 /***
3 * ___====-_ _-====___
4 * _--^^^#####// \\#####^^^--_
5 * _-^##########// ( ) \\##########^-_
6 * -############// |\^^/| \\############-
7 * _/############// (@::@) \\############\_
8 * /#############(( \\// ))#############\
9 * -###############\\ (oo) //###############-
10 * -#################\\ / VV \ //#################-
11 * -###################\\/ \//###################-
12 * _#/|##########/\######( /\ )######/\##########|\#_
13 * |/ |#/\#/\#/\/ \#/\##\ | | /##/\#/ \/\#/\#/\#| \|
14 * ` |/ V V ` V \#\| | | |/#/ V ' V V \| '
15 * ` ` ` ` / | | | | \ ' ' ' '
16 * ( | | | | )
17 * __\ | | | | /__
18 * (vvv(VVV)(VVV)vvv)
19 * 神兽保佑
20 * 代码无BUG!
21 */
22
23 static int compare(int a, int b, int c) {
24 if(b == 0) return Math.min(a, c);
25 int temp = Math.min(a, b);
26 return Math.min(temp, c);
27
28 }
29 public static void main(String args[]) {
30 Scanner sc = new Scanner(System.in);
31 int num = sc.nextInt();
32 int[][] time = new int[num+1][3]; //存放时间
33 int[] high = new int[num+1]; //存放楼层高度
34 int count = 0;
35 for(int i = 1; i <= num; i++) {
36 high[i] = sc.nextInt();
37 count += high[i];
38 }
39
40 Arrays.fill(time[0], count);
41 for(int i = 0; i < num; i++) {
42
43 time[i+1][0] = time[i][2] - high[i+1]; //第一列为上一次跳一层后,用的总时间
44 if(i < num-1)
45 time[i+2][1] = time[i][2] - high[i+1] - high[i+2]; //第二列为上一次跳两层后,用的总时间
46
47 time[i+1][2] = compare(time[i][0], time[i][1], time[i][2]); //第三列为爬一层后用的总时间,比较后赋值
48 }
49 int result = Math.min(time[num][0], time[num][1]);
50 System.out.print(Math.min(result, time[num][2])); //输出最后一层用的总时间
51
52 }
53 }
如果有大佬有其他方法,希望能提供代码参考,谢谢,DP不是很会。