---恢复内容开始---
拦截导弹
- 描述
-
某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
- 输入
- 第一行输入测试数据组数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); } } }
运行结果:
---恢复内容结束---