动态规划之防卫导弹
来源:互联网 发布:哪些外卖软件首单立减 编辑:程序博客网 时间:2024/05/21 10:31
问题:
一种新型的防卫导弹可截击多个攻击导弹。它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导弹,但不可以向后或向上飞行。但有一个缺点,尽管它发射时可以达到任意高度,但它只能截击比它上次截击导弹时所处高度低或者高度相同的导弹。现对这种新型防卫导弹进行测试,在每一次测试中,发射一系列的测试导弹(这些导弹发射的间隔时间固定,飞行速度相同),该防卫导弹所能获得的信息包括各进攻导弹的高度,以及它们发射次序。现要求编一程序,求在每次测试中,该防卫导弹最多能截击的进攻导弹数量,一个导弹能被截击应满足下列两个条件之一:
a)它是该次测试中第一个被防卫导弹截击的导弹;
b)它是在上一次被截击导弹的发射后发射,且高度不大于上一次被截击导弹的高度的导弹。
分析: 从最后一枚向前找
代码如下:
#include <iostream>#include <algorithm>using namespace std;void best(int n);int a[100]; //发射的导弹序列int l[100]; // 表示拦截从第i枚导弹到最后一枚导弹的最大数目int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } l[n - 1] = 1; //初始化最后一枚导弹,从倒数第二颗到最后一颗导弹只能拦截一枚(除了倒数第二颗) //计算 best(n); //sort(l, l+n); for (int i = 0; i < n; i++) { cout << l[i] << endl; } cout << l[n-1] << endl;}void best(int n) { for (int i = n - 2; i >= 0; i--) { //从倒数第二颗一直往前找 int max = 0; for (int j = i + 1; j < n; j++) { //从i+1的位置开始向后查 if (a[j] <= a[i]) { //后面的必须小于前面的才能够拦截 if (l[j] > max) { //碰到大的就交换一下 max = l[j]; } } } l[i] = max + 1; //把自己本身加上 }}
0 0
- 动态规划之防卫导弹
- 防卫导弹_动态规划
- 防卫导弹(动态规划入门题)
- 动态规划——防卫导弹
- 【动态规划:防卫导弹】:离散化+DP;15ms;
- 动态规划之拦截导弹
- 动态规划之导弹拦截
- 防卫导弹
- 防卫导弹
- C++动态规划算法之拦截导弹
- 动态规划-导弹拦截
- 导弹拦截 动态规划
- 【动态规划】拦截导弹
- 动态规划 拦截导弹
- 动态规划 - 拦截导弹
- 动态规划--防御导弹
- 导弹拦截-动态规划
- 导弹拦截---动态规划
- world文件读写
- 从今天开始
- js错误处理与调试理论和办法
- 解题报告 之 HOJ2276 SOJ2498 Count prime
- 仿QQ聊天界面<一>
- 动态规划之防卫导弹
- gdb使用方法简介
- 最近的一些创业点滴的记录2
- [Windows]_[中级]_[界面程序打开控制台输出-转发输出到控制台]
- C++虚函数和虚继承浅析
- 设计模式(5)——单例模式
- Oracle 11G 卸载问题
- Unity 多人联网客户端编写
- acdream 1116 Gao the string! (扩展kmp,dp思想,矩阵优化)