import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] nums = new int[n]; int index = 0; // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case nums[index] = in.nextInt(); index++; } // 第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。 int[] dp = new int[n]; Arrays.fill(dp,1); int res = dp[0]; // 最大连续下降序列 for(int i = 1; i < n; i++){ for(int j = 0; j < i; j++){ if(nums[i] <= nums[j]){ dp[i] = Math.max(dp[i], dp[j] + 1); } res = Math.max(res, dp[i]); } } // 最少要多少个系统,不同的系统拦截的数量是不一样的,比如某个系统最大拦截6,另外一个系统最大拦截可能就是3了,所以需要统计 // Dilworth定理:最少的下降序列个数等于整个序列最长上升子序列的长度 // 本质上是在计算最长递增子序列的长度,因为每出现一个比之前所有的高的导弹,就需要新增一个系统 int count = 0; int[] dp2 = new int[n]; Arrays.fill(dp2,1); for(int i = 1; i < n;i++){ for(int j = 0; j < i; j++){ if(nums[i] > nums[j]){ dp2[i] = Math.max(dp2[i], dp2[j] + 1); } } } for(int i = 0; i < n; i++){ count = Math.max(count, dp2[i]); } System.out.println(res); System.out.println(count); } }