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