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