动态规划——炮弹问题
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 }
以上是关于动态规划——炮弹问题的主要内容,如果未能解决你的问题,请参考以下文章