动态规划——炮弹问题

Posted dream-flying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划——炮弹问题相关的知识,希望对你有一定的参考价值。

问题

某国进行军事演戏,研发一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。请你帮忙选择一套系统,根据测试的导弹数量和每次导弹飞来的高度,计算出最多能拦截导弹的数目。

 

分析

实质是寻找最长递降子序列。

 

code

 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public static void main(String args[]) {
 5         Scanner s = new Scanner(System.in);
 6         int N = s.nextInt(); //测试数据的数量
 7         int[] ar = new int[20];
 8         while(N>0) {
 9             int n = s.nextInt();
10             for(int i=0;i<n;i++) {
11                 ar[i] = s.nextInt();
12             }
13             int count = findMaxDesc(ar,n);
14             N--;
15             System.out.println(count);
16         }
17         s.close();
18         
19     }
20     //寻找最长递减子序列
21     public static int findMaxDesc(int[] ar, int n) {
22         int[] dp = new int[n];
23         dp[0] = 1; //初始化
24         int max = dp[0]; //记录最大值
25         for(int i=1;i<n;i++) {
26             int temp = 0;
27             for(int j=i-1;j>=0;j--) {
28                 if(ar[j]>=ar[i]) {
29                     temp = Math.max(temp, dp[j]);
30                 }
31             }
32             dp[i] = temp+1; //更新当前位置值
33             max = Math.max(max, dp[i]); //更新最大值
34         }
35         return max;
36     }
37 }

 

以上是关于动态规划——炮弹问题的主要内容,如果未能解决你的问题,请参考以下文章

动态规划——背包LISLCS

拦截导弹(线性动态规划)

ALGO-13 拦截导弹(动态规划(贪心))

1112.拦截导弹(简单的动态规划)

每周一讲之动态规划

动态规划 最长上升子序列模型——进阶