• 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不是很会。

     
  • 相关阅读:
    WIA Property Constant Definitions
    未能导入activex控件,请确保它正确注册"的完美解决方案
    ILSpy反编译工具的使用
    WIA
    在C#中使用WIA获取扫描仪数据
    在C#中使用WIA获取扫描仪数据(利用Filter处理图片)
    VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
    怎么添加项目到SVN上面
    数学家帮你找出最佳求职者 你只要先淘汰前37%的人
    程序员7大软技能测验 你得几分?
  • 原文地址:https://www.cnblogs.com/ohuo/p/12330932.html
Copyright © 2020-2023  润新知