动态规划之防卫导弹

来源:互联网 发布:哪些外卖软件首单立减 编辑:程序博客网 时间: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
原创粉丝点击