线性状态动态规划 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\n", 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]);

 

posted @ 2020-06-13 12:09  Jason66661010  阅读(208)  评论(0编辑  收藏  举报