F. Yet Another Segments Subset
题意
给n个区间,让选出一些区间,选出的这些区间要么不相交,要么包含。问选出的最大的数量是多少。
n <= 3000
bb
区间dp,
dp[i][j] 表示 i ~ j 区间能选出的最多的数量。
但是普通的区间dp是n^3 .
所以 可以优化一下:
区间dp 一般就是:枚举长度,枚举起点,枚举 l ~ r 中间状态转移的位置.
可以发现 l ~ r 中间状态转移的位置可以优化,不用从 l ~ r 枚举一遍。只用从在这个区间里的转移就好。
num数组要开bool类型省空间,不然mle。 题上说了每个区间只出现一次。
#include<algorithm>
#include<iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <unordered_set>
#include <climits>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef unsigned long long ull;
typedef unordered_set<int>::iterator sit;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
void tempwj(){
freopen("hash.in","r",stdin);freopen("hash.out","w",stdout);}
ll gcd(ll a,ll b){
return b == 0 ?