导弹拦截之动态规划

 

 防御导弹

题目描述

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

输入

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

输出

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

样例输入

300 250 275 252 200 138 245

样例输出

5
import java.util.Arrays;
import java.util.Scanner;

public class Main{
	static int R=0;//保存结果,声明为全局变量
	public static int aa(int[] data,int i,int min,int N) {
		for(;i<data.length;i++) {//从数组当前的值开始遍历
			if(data[i]<=min) {//假如当前值小于min便有两种选着(1、拦下了2、不拦下来)否者i++遍历下一个元素
				int num1=aa(data, i+1, data[i], N+1);//拦截当前导弹 min改为当前值,N自动加一(递归)
				int num2=aa(data, i+1, min, N);//不拦截当前导弹,min还是min(递归)
				if(num1>num2) {//在遍历的一轮结束后,将大值付给N
					N=num1;
				}else {
					N=num2;
				}
			}
		}
		R=R>N?R:N;//将没一轮的比较后的大值赋给R,即R保存最大值
		N=0;//每一轮结束后N归零,从新开始下一轮
		return N;
	}
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		String string1=scanner.nextLine();
		String[] strings=string1.split(" ");//字符串转换为字符串数组
		int[] data=new int[strings.length];
		for(int i=0;i<strings.length;i++) {
			data[i]=Integer.parseInt(strings[i]);//将字符串数组转换为整数数字
		}
		int N=0;//在每一趟搜索时保存的拦截炮弹数
		N=aa(data,0,30000,N);//题目要去《=30000,所以min的初始值设为30000
		System.out.println(R);
	}
}

  

posted @ 2018-12-15 16:55  醉画仙  阅读(493)  评论(0编辑  收藏  举报