当前位置:   article > 正文

拦截导弹—动态规划—C++详解_daodanlanjie c++动规

daodanlanjie c++动规

题目描述:

某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。

输入:

第一行输入测试数据组数N(1<=N<=10)
接下来一行输入测试数据共有多少个导弹m(1<=m<=20)
接下来输入导弹依次飞来的高度,所有高度值均是大于0的正整数。

输出:

输出最多能拦截的导弹数目

思路:

此题完全类似于求最长上升子序列,只不过本题求的是最长下降子序列,两题思路完全相同,因此使用动态规划解决。

具体思路见:最长上升子序列(动态规划)——C++

代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. int high[20+1];
  4. int dp[20+1];
  5. int N,m;
  6. int main()
  7. {
  8. int i,j,maxn;
  9. cin>>N;
  10. while(N>0)
  11. {
  12. cin>>m;
  13. dp[1]=1;
  14. for(i=1;i<=m;++i)
  15. cin>>high[i];
  16. for(i=2;i<=m;++i)
  17. {
  18. for(j=1;j<i;++j)
  19. {
  20. maxn=0;
  21. if(high[i]<high[j]&&dp[j]>maxn)
  22. {
  23. maxn=dp[j];
  24. }
  25. }
  26. dp[i]=maxn+1;
  27. }
  28. maxn=0;
  29. for(i=1;i<=m;++i)
  30. {
  31. if(dp[i]>maxn)
  32. maxn=dp[i];
  33. }
  34. cout<<maxn<<endl;
  35. --N;
  36. }
  37. return 0;
  38. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/691496
推荐阅读
相关标签
  

闽ICP备14008679号