【键值对的LIS】 友好城市

传送门

题意

给定\(N\)个数对,其中\((x,y)\)分别表示一个相对的两岸,两者之间连一条线,不允许有交叉,问最多可以连多少

数据范围

\(\begin{array}{l}1 \leq N \leq 5000 \\ 0 \leq x_{i} \leq 10000\end{array}\)

题解

每个点对按照一个的值排序,对另一个值求最长上升子序列即可

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define ll long long
#define fi first
#define se second
typedef pair<int,int>pii;
const int N=5010;
pii a[N];
int n,f[N];
int main(){
    scanf("%d",&n);
    rep(i,1,n+1) scanf("%d%d",&a[i].fi,&a[i].se);

    sort(a+1,a+n+1);
    int ans=-1;

    rep(i,1,n+1){
        f[i]=1;
        rep(j,1,i)
            if(a[j].se < a[i].se)
                f[i]=max(f[i],f[j]+1);
        ans=max(ans,f[i]);
    } 
    printf("%d\n",ans);
}



猜你喜欢

转载自www.cnblogs.com/hhyx/p/13390782.html