1263:【例9.7】友好城市
1263:【例9.7】友好城市
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 12906 通过数: 7548
【题目描述】
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
【输入】
第1行,一个整数N(1≤N≤5000),表示城市数。
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。(0<≤xi≤10000)
【输出】
仅一行,输出一个整数,表示政府所能批准的最多申请数。
【输入样例】
7 22 4 2 6 10 3 15 12 9 8 17 17 4 2
【输出样例】
4
知识点:
结构体 sort 最长上升子序列
思路:
先根据其中一岸排序(升序)
sort(a+1,a+n+1,cmp);
再求另一岸的最长上升子序列
for(int i=1;i<=n;i++){ for(int j=1;j<i;j++){ if(a[i].x>a[j].x&&dp1[i]<dp1[j]+1){ dp1[i]=dp1[j]+1; } } }
最终代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{ 4 int x,y; 5 }a[5005]; 6 bool cmp(node x,node y){ 7 return x.y<y.y; 8 } 9 int main(){ 10 int n,dp1[5005]; 11 cin>>n; 12 for(int i=1;i<=n;i++){ 13 cin>>a[i].x>>a[i].y; 14 dp1[i]=1;//dp1数组初始化 15 } 16 sort(a+1,a+n+1,cmp);//根据北岸排序 17 for(int i=1;i<=n;i++){ 18 for(int j=1;j<i;j++){ 19 if(a[i].x>a[j].x&&dp1[i]<dp1[j]+1){ 20 dp1[i]=dp1[j]+1; 21 } 22 } 23 }//求最长上升子序列 24 int maxx=0; 25 for(int i=1;i<=n;i++){ 26 maxx=max(maxx,dp1[i]); 27 }cout<<maxx; 28 return 0; 29 }