题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截 系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试 用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)
输出
整数M。表示:这套系统最多能拦截 M 枚导弹.
样例输入
300 250 275 252 200 138 245
样例输出
5
思路
用两个数组 x[i]存放每一发炮弹的发射高度,dp[i]存放以当前第i个导弹为结尾的最长下降子序列长度。dp初始值值为1.
用i遍历每一个导弹的高度,用j遍历i前的每一个导弹高度,用以j与i 比较 更新dp[i].。
j遍历完后获得序列第i为结尾的最长长度。
因为所得的最优解不一定是以最后一个为结尾的序列
用 res 记录从i=0 到i = num-1 的最优长度。
循环结束后res 为此序列的最长的长度。
AC java代码 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x[]=new int[20];
int dp[]=new int[20];
int num=0;
while(scanner.hasNext()){
x[num++]=scanner.nextInt();
}
int res = 0;
for(int i = 0; i < num; ++i){
dp[i] = 1;
for(int j = 0; j < i; ++j)
if(x[j] >=x[i]) dp[i] = Math.max(dp[i], dp[j] + 1);
res = Math.max(res, dp[i]);
}
System.out.println(res);
}
}
AC java代码 2
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = 0;
int[] a = new int[20];
while(scanner.hasNext()){
a[count++] = scanner.nextInt();
}
int[] b = new int[count];
b[0] = 1;
for(int i=1;i<count;i++)
b[i] = 0;
for(int i=1; i<count; i++){
boolean found=false;
int ans_store=b[0];
int pos=0;
for(int j=0; j<i; j++)
if(a[j]>=a[i] && b[j]>=b[pos]){
ans_store=b[j];
pos=j;
found=true;
}
if(found)
b[i]=1+b[pos];
else
b[i]=1;
}
Arrays.sort(b);
System.out.println(b[count-1]);
}
}