zoukankan      html  css  js  c++  java
  • 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不是很会。

     
  • 相关阅读:
    E. Paired Payment 题解(多维最短路)
    九峰与子序列 题解(dp+hash)
    魏迟燕的自走棋 题解(并查集+思维)
    unix学习资料
    Tomcat > Cannot create a server using the selected type
    myeclipse使用hibernate正向工程和逆向工程
    jira的破解
    jsp:useBean用法
    java一个多线程的经典例子
    head first系列PDF资源
  • 原文地址:https://www.cnblogs.com/ohuo/p/12330932.html
Copyright © 2011-2022 走看看