二刷提高课,题解目录在这里— 提高课的题解目录
我们需要注意一下导致交叉的前提是什么,肯定是两边的城市前后顺序不同
同时考虑两组前后顺序肯定是不行的所以我们固定一组
将某边城市固定并进行排序,再来看另一边,
我们可以发现,若另一边从1到n进行枚举时,若是升序则一定不会存在交叉(另一边也是升序)
所以只有降序的点会导致交叉,题目要求避免交叉的情况批准的最多
那对于另一边来说就是最长上升子序列长度的问题
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int f[5010];
typedef pair<int ,int >PII;
vector<PII>us;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
us.push_back({a,b});
}
sort(us.begin(),us.end());
for(int i=0;i<us.size();i++)
{
f[i]=1;
for(int j=0;j<i;j++)
{
int x=us[i].second,y=us[j].second;
if(x>y)f[i]=max(f[i],f[j]+1);
}
}
int res=0;
for(int i=0;i<n;i++)res=max(res,f[i]);
cout<<res;
}