线性状态动态规划 P1020 导弹拦截最长上升子序列

Posted jason66661010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性状态动态规划 P1020 导弹拦截最长上升子序列相关的知识,希望对你有一定的参考价值。

题目

https://www.luogu.com.cn/problem/P1020

技术图片

 

 

 题目分析

系统最多能拦截的导弹数量就是这个序列的最长不上升子序列;而需要的系统数量就是这个序列的最长不下降子序列

方法一:使用贪心+二分(https://www.cnblogs.com/Jason66661010/p/13054793.html

代码

#include<iostream>
#include<set>
#include<cstdio>
#include<algorithm>
#include<functional>
using namespace std;
int list[100011];
int main()
{
    int len=0;
    while (cin >> list[len++]); len--;//注意这里的输入方式,使用scanf()的话由于数据最后没有回车,会超时
    multiset<int,greater<int> >out;//这里注意,greater<int>后面要有一个空格,不能与后面的>连起来
    multiset<int>out2;
    for (int i = 0; i < len; i++)
    {
        multiset<int, greater<int> >::iterator it=out.upper_bound(list[i]);
        if (it != out.end())out.erase(it);
        out.insert(list[i]);

        multiset<int>::iterator it2 = out2.lower_bound(list[i]);
        if (it2 != out2.end())out2.erase(it2);
        out2.insert(list[i]);
    }
    printf("%d
", out.size());
    printf("%d", out2.size());
}

最长上升序列:

set<int>out;
set<int>::iterator it = out.lower_bound(list[i]);

最长不下降子序列:

multiset<int>out;
multiset<int>::iterator it = out.upper_bound(list[i]);

最长下降序列:

set<int, greater<int> >out;
set<int>::iterator it = out.lower_bound(list[i]);

最长不上升序列:

multiset<int, greater<int> >out;
multiset<int>::iterator it = out.upper_bound(list[i]);

 

以上是关于线性状态动态规划 P1020 导弹拦截最长上升子序列的主要内容,如果未能解决你的问题,请参考以下文章

动态规划 最长上升子序列模型——进阶

动态规划 最长上升子序列模型——进阶

导弹拦截 p1020

luogu P1020 导弹拦截

洛谷P1020导弹拦截——LIS

拦截导弹(线性动态规划)