题目描述
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入描述
本题有多组测试数据。输入的第一行为导弹的个数n(0<n<10000)。接下来每行为导弹依次飞来的高度h(不大于30000的正整数)
输出描述
对每组输入数据,输出一行,为最多拦截的导弹个数。
解题报告:
简单dp
/**
* 题目描述
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入描述
本题有多组测试数据。输入的第一行为导弹的个数n (0<n<10000)。接下来每行为导弹依次飞来的高度h(不大于30000 的正整数)
输出描述
对每组输入数据,输出一行,为最多拦截的导弹个数。
*/
import java.util.Scanner;
public class N13Bumb {
int count=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] a =new int[100][10000];
int i=0;
while(sc.hasNext()){
int n =sc.nextInt();
a[i][0]=n;
for(int j=1;j<=n;j++){
a[i][j]=sc.nextInt();
}
i++;
}
for(int k=0;k<i;k++){
N13Bumb bumb = new N13Bumb();
int b[] = new int[a[k][0]];
ArraySort(a[k][0],a[k],b);
bumb.count=bumb.Intercept(a[k][0],a[k],b);
System.out.println(bumb.count);
}
}
private static void ArraySort(int n,int[] a,int[] b) {
for(int i=1;i<=n;i++){
b[i-1]=a[i];
}
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(b[j]<b[j+1]){
int temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
}
}
private int Intercept(int n, int[] c,int[] b) {
int[][] m = new int[n][n];
if(c[1]==b[0]){
m[0][0]=1;
}else{
m[0][0]=0;
}
for(int i=1;i<=n;i++){
for(int j=0;j<n;j++){
if(i==1&&j==0){
continue;
}
if(c[i]==b[j]){
if(j==0){
m[i-1][j]=m[i-1][j]+1;
}else if(i==1){
m[i-1][j]=m[i-1][j-1]+1;
}
else{
m[i-1][j]=m[i-2][j-1]+1;
}
}else{
if(i==1){
m[i-1][j]=m[i-1][j-1];
}else if(j==0){
m[i-1][j]=m[i-2][j];
}
else{
m[i-1][j]=m[i-2][j]>m[i-1][j-1]?m[i-2][j]:m[i-1][j-1];
}
}
}
}
return m[n-1][n-1];
}
}