思路:使用 LIS(最长上升子序列)算法,求出不降子序列的长度,即为需要配备的系统数。

具体实现:

  1. 使用一个数组dp记录以第i个导弹为结尾的不降子序列的长度。

  2. 对于每个导弹的高度h,从前往后遍历之前的导弹高度,找到比h小的最大高度,设为h2,如果不存在比h小的高度,则h2=0。

  3. 则dp[i] = dp[j] + 1,其中j为满足h2>=h[j]的最大的j。

  4. 最终的答案即为dp数组中的最大值。

代码实现如下:

import java.util.Scanner;

public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] heights = new int[n]; for (int i = 0; i < n; i++) { heights[i] = scanner.nextInt(); } int[] dp = new int[n]; dp[0] = 1; for (int i = 1; i < n; i++) { int h = heights[i]; int h2 = 0; for (int j = i - 1; j >= 0; j--) { if (heights[j] <= h) { h2 = heights[j]; break; } } int maxDp = 0; for (int j = i - 1; j >= 0; j--) { if (heights[j] >= h2) { maxDp = Math.max(maxDp, dp[j]); } } dp[i] = maxDp + 1; } int ans = 0; for (int i = 0; i < n; i++) { ans = Math.max(ans, dp[i]); } System.out.println(ans); }

用java解决以下题目:某国为了防御敌国的导弹袭击开发出了一种导弹拦截系统但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度但是以后每一发炮弹都不能高于前一发的高度。某天雷达捕捉到敌国的导弹来袭由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹输入导弹依次飞来的高度雷达给出的高度不大于30000的正整数。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统输入为n颗依次飞来

原文地址: https://www.cveoy.top/t/topic/fjJk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录