动态规划之拦截导弹

---恢复内容开始---

拦截导弹 

描述

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

输入
第一行输入测试数据组数N(1<=N<=10)
接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)
接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。
输出
输出最多能拦截的导弹数目
样例输入
2
8
389 207 155 300 299 170 158 65
3
88 34 65
样例输出
6
2

思路:求最长子序列
1.定义两个长度一样的数组,一个数组a用来存储敌方发射过来的导弹,一个数组b存储我方拦截的导弹的个数,且b数组中初始值为1。
2.在数组a中从数组的最后一位往前面的开始比较,如果a[i]>a[i+1],则a[i]可以拦截a[i+1],此刻b[i]的值为2.
3.具体的动态规划过程看下图:
每一数都与后面的一个数相比,如果大于,说明拦截不到该导弹,就继续与下一个数相比。如果小于则可以拦截到该导弹。
代码如下:
package othermethod;

import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(new BufferedInputStream(System.in));
        int t=sc.nextInt();//t组测试数据
        int a[]=new int[22];
        int b[]=new int[22];
        while(t-->0){
            int n=sc.nextInt();
            for(int i=0;i<n;i++)
                a[i]=sc.nextInt();
            for(int i=0;i<n;i++)
                b[i]=1;
            for(int i=n-2;i>=0;i--){
                int max=0;
                for(int j=i+1;j<n;j++){
                    if(a[i]>a[j])
                        if(b[j]>max)
                            //寻找最大的导弹拦截的个数
                            max=b[j];
                }
                b[i]+=max;
               
            }
            int max=0;
            for(int i=0;i<n;i++)
                if(b[i]>max)
                    max=b[i];
            System.out.println(max);
        }
    }
}

运行结果:

 

---恢复内容结束---

posted @ 2017-08-01 09:48  汗水与荣光  阅读(441)  评论(0编辑  收藏  举报