思路:只要a城市位置在b城市的右边,且a城市的友好城市在b城市的友好城市的右边,则相连不会交叉。所以根据这个特性求北岸或南岸的LIS就行。b根据a的位置来记录,则a排序后不会影响求友好城市(对比a[i],b[i]排序后就不知道友好城市是谁了)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 5050,M = 10010;
int a[N],b[M],f[N];
int n;
int main()
{
scanf("%d",&n);
for(int k=1;k<=n;k++)
{
int i,j;
scanf("%d%d",&i,&j);
a[k]=i;
b[a[k]]=j;
}
//初始化
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)f[i]=1;
//状态转移方程
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(a[i]>a[j]&&b[a[i]]>b[a[j]])f[i]=max(f[i],f[j]+1);
}
}
//输出结果
int res=0;
for(int i=1;i<=n;i++)
res=max(res,f[i]);
cout<<res;
return 0;
}