给定N个区间,求最大的不相交的区间数
//动态规划,递推公式:f[i] = max(f[i-1],f[g[i]-1]+1);
//f[i]表示时间0~i最多所能听的报告数,g[i]表示所有以时间 i 结束的报告中,最晚的开始时间。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <utility>
using namespace std;
const int MAXX=111111;
typedef pair<int,int> pil;
int main()
{
int n,mxp=0;
pil arr[MAXX];
int f[MAXX]; //f[i]表示时间0-i最多能听的报告数
int g[MAXX]; //g[i]表示以时间i结束的报告中,最晚的开始时间
cin>>n;
memset(g,-1,sizeof(g));
for(int i=0;i<n;i++)
cin>> arr[i].first>>arr[i].second;
sort(arr,arr+n);
for(int i=0;i<n;i++)
{
if(i==n-1||arr[i].second!=arr[i+1].second)
g[arr[i].second]=arr[i].first;
mxp=max(mxp,arr[i].second);
}
f[0]=0;
for(int i=1;i<=mxp;i++)
{
if(g[i]!=-1) f[i]=max(f[i-1],f[g[i]-1]+1);
else f[i]=f[i-1];
}
cout<<f[mxp]<<endl;
cin>>n;
return 0;
}