ADV-302 秘密行动 java

问题描述
  小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用。已知向上1高度消耗的时间为1,跳跃不消耗时间。由于事态紧急,小D想知道他最少需要多少时间到达顶层。
输入格式
  第一行包含一个整数n,代表楼的高度。
  接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。
输出格式
  输出1行,包含一个整数,表示所需的最短时间。
样例输入
5
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不是很会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值