导弹拦截问题(不知道动态规划怎么解?)
最近遇到一道题,经过一段时间才思考出来。后来才听身边的同学说这道题要用到动态规划算法。反正我是一点也不知道,就那样写了呗。
个人觉得这是我为数不多的思路很清晰的一次代码了,所以写了下来备份,算是留作纪念吧。以前在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 }

浙公网安备 33010602011771号