cf div.3 F. Yet Another Segments Subset

一道关于区间选择的问题,要求选出的区间不相交或互相包含,最大数量不超过3000。通过优化区间动态规划算法,将时间复杂度降低,从n^3优化到更优,利用bool类型数组节省空间,避免内存超限错误。
摘要由CSDN通过智能技术生成

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 ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值