导弹拦截问题(不知道动态规划怎么解?)

  最近遇到一道题,经过一段时间才思考出来。后来才听身边的同学说这道题要用到动态规划算法。反正我是一点也不知道,就那样写了呗。

个人觉得这是我为数不多的思路很清晰的一次代码了,所以写了下来备份,算是留作纪念吧。以前在ACM团队的时候,这种题可不知道遇到多少。

 

 

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截 系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试 用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入

最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)

输出

整数M。表示:这套系统最多能拦截 M 枚导弹.

样例输入

300 250 275 252 200 138 245

样例输出

5


 1 import java.util.Scanner;
 2 /**
 3  * 导弹拦截问题
 4  * @author 那一抹微笑
 5  *
 6  */
 7 public class T2 {
 8 
 9     public static void main(String[] args) {
10         Scanner  scanner = new Scanner(System .in);
11         String s =scanner .nextLine();    //输入一行待求解的数字字符
12         String [] string =s.split(" ");        //将字符串数组转换为整型数字数组
13         int [] arr=new int [20];
14         for(int i=0;i<string.length;i++)
15         {
16             arr[i]=Integer.parseInt(string[i]);
17         }
18         int temp=0,geshu;                        //temp用于备份当前最大拦截值
19         int min;                                        //min用于记录当前导弹的高度
20         int len=string .length;
21         if(len==1)                                    //特殊情况,这是一个不大起眼的小坑,初学者往往掉进去
22         {
23             System.out.println(1);
24             return;
25         }
26         /**
27          * 外层循环用于遍历拦截的第一发导弹,每一颗导弹都可以作为第一发拦截的导弹
28          */
29         for(int i=0;i<len-1;i++) {
30                 min=arr[i];
31                 geshu=1;        //经过if语句过后,一定可以拦截至少一枚导弹
32                 /**
33                  * 第二层循环
34                  * 可以分析得出,要想得到拦截最大值,有以下两点可以快速遍历
35                  * 1.如果当前数字的后面一个数比它小,且这个比它小的数的再后一个还大一些,那么就直接更新min值为更后面这个数
36                  * 这句话有点绕,可以举个例子:若如 3   1  2,初始min=3,且1和2都小于3,但是2要比1稍大且小于3,所以直接跳过1,将min=2
37                  * 2.如果if没有执行1,那么要么就是后面这个数比当前数大或者小,大则直接k++,小则更新min
38                  */
39                 for(int k=i+1;k<len;) {
40                     if(min>=arr[k+1]&&arr[k+1]>arr[k])
41                     {
42                         geshu++ ;
43                         min=arr[k+1];
44                         k=k+2;
45                         continue;
46                     }
47                     if(min>=arr[k])
48                     {
49                         geshu++;
50                         min=arr[k];
51                         k++;
52                         continue;
53                     }
54                     if(min<arr[k])
55                     {
56                         k++;
57                     }
58                 }
59                 if(temp<geshu)
60                     temp=geshu;
61             }
62         System.out.println(temp);
63         scanner .close();
64         }
65 }

 

 
posted @ 2018-12-22 22:33  myjoker  阅读(603)  评论(0)    收藏  举报