题目
某国为了防御敌国的导弹袭击,发展出一种导弹 拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的 导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入格式:
一行,为导弹依次飞来的高度
输出格式:
两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
输入样例:
389 207 155 300 299 170 158 65
输出样例:
6
2
参考解答:
动态规划
求最长的上升子序列和最长的下降子序列
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer>list = new ArrayList<Integer>();
Scanner ss = new Scanner(sc.nextLine());
while(ss.hasNext()) {
int x = ss.nextInt();
list.add(x);
}
int []dp_up = new int [list.size()];
int []dp_down = new int [list.size()];
int up = 0,down = 0;
for(int i=0; i<list.size(); i++) {
for(int j=0; j<i; j++) {
if(list.get(i) <= list.get(j) && dp_up[i]<(dp_up[j]+1)) {
dp_up[i] = dp_up[j]+1;
}
else if(list.get(i) > list.get(j) && dp_down[i]<(dp_down[j]+1)) {
dp_down[i] = dp_down[j]+1;
}
if(up < dp_up[i]) {
up = dp_up[i];
}
if(down < dp_down[i]) {
down = dp_down[i];
}
}
}
System.out.println(up+1);
System.out.println(down+1);
}
}