1263:友好城市
- 北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同
- 在保证任意两条航线不相交的情况下,被批准的申请尽量多
题目分析:
如图:最开始所有点为图1这种情况,我们需要处理不相交 - 那么转换为图2,需要先把第一列数从小到大排列
- 为了求得最多的情况,求第二列数的最长上升子序列(保证这列坐标从小到大,这样就不相交)
代码如下:
#include<bits/stdc++.h> using namespace std; #define mm(a,x) memset(a,x,sizeof a) #define mk make_pair #define ll long long #define pii pair<int,int> #define inf 0x3f3f3f3f #define lowbit(x) (x) & (-x) const int N = 5010; int n; pii q[N]; int f[N]; int main() { cin >> n; for(int i = 1; i <= n; i ++ ){ cin >> q[i].first >> q[i].second; } sort(q + 1,q + n + 1); int res = 0; for(int i = 1; i <= n; i ++ ){ f[i] = 1; for(int j = 1; j < i; j ++ ){ if(q[j].second < q[i].second){ f[i] = max(f[i],f[j] + 1); } } res = max(res,f[i]); } cout<<res; return 0; }