ADV-302 秘密行动 java
问题描述
小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不是很会。