如果任意两个城市不会发生交叉,那么两座城市在南北两侧的顺序应该是相同的。若给任意一侧的城市按顺序编号,那么要想不出现交叉的现象在另一侧对应城市的编号顺序一定是单调递增或递减的。如此可得,将某一侧城市按顺序编号,只需找到另一侧对应编号的最长上升子序列。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
PII pii[5010];
int dp[5010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>pii[i].first>>pii[i].second;
}
sort(pii+1,pii+n+1);
int res=0;
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(pii[j].second<pii[i].second){
dp[i]=max(dp[i],dp[j]+1);
}
}
res=max(res,dp[i]);
}
cout<<res;
return 0;
}