Dilworth定理(听着很屌,不需要记着他的名字,明白意思就行):一个数列按升序或者降序能分成n个单独子序列,则他的反向单个最长子序列长度为n
所以本题就只需先将第一个数按降序排列,求第二个数的最长上升子序列即可。
/*
思路:将第一个个数排列,求第二个数降序长度就是要求的答案
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
struct node{
int b1,b2;
}a[5005];
bool cmp(node x,node y){
if(x.b1==y.b1)return x.b2>y.b2;
return x.b1>y.b1;
}
int c[5005];
int len;
int dp[5005];
void init(){
len=1;
dp[len]=c[1];
}
//最长上升子序列dp模板
void solve(){
init();
for(int i=2;i<=n;i++){
if(c[i]>dp[len]){
dp[++len]=c[i];
}
else {
int pos=lower_bound(dp+1,dp+len+1,c[i])-dp;
dp[pos]=c[i];
}
}
printf("%lld\n",len);
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&a[i].b1,&a[i].b2);
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
c[i]=a[i].b2;
}
solve();
return 0;
}