算法实践:导弹拦截

导弹拦截

描述

某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。

输入

输入有两行,

第一行,莱尼尔射出的箭雨的数量k(k<=10000),

第二行,k个正整数,表示k支雷电箭的高度,按发射顺序给出,以空格分隔。(高度Height <=50000)

输出

输出只有一行,包含一个整数,表示最多能拦截多少支雷电箭。

样例

8
300 207 155 300 299 170 158 65
6

难度

中,动态规划

解题思路

转化为寻找最长不上升子列

代码

#include "bits/stdc++.h"
#include "vector"
#include "algorithm"
using namespace std;
int lengthOfLIS(int *nums,int n) {
     
    if (n == 0) return 0;
    int dp[n];
    for (int i = 0; i < n; ++i) {
     
        dp[i] = 1;
        for (int j = 0; j < i; ++j) {
     
            if (nums[j] >= nums[i]) {
     
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
    }
    int max = dp[0];
    for(int i=1;i<n;i++){
     
        if(dp[i]>max) max = dp[i];
    }
    return max;
//    return *max_element(dp.begin(), dp.end());
}
int main()
{
     
    int n;
    cin>>n;
    int nums[n];
    for(int i = 0;i<n;i++)
        cin >> nums[i];
    cout<<lengthOfLIS(nums,n);
}

你可能感兴趣的:(算法设计)