题目描述
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。
北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。
编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
输入格式
第1行,一个整数N,表示城市数。
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。
输出格式
仅一行,输出一个整数,表示政府所能批准的最多申请数。
数据范围
1≤N≤5000,
0≤xi≤10000
输入样例:
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2
输出样例:
4
注意
两条航线不相交的条件:
a1<a2 && b1>b2
即:每一条航线组成的集合互不包含
算法
建一个类Node,设置两个属性a,b,可以用类Node实例化一个Node类型的数组,数组的每一个下标储存a,b两个值
先用比较器对类Node中属性a进行从小到大的排序,将一岸升序排序,另一岸找最长上升子序列
java 代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static class Node implements Comparable<Node>{
private int a;
private int b;
public Node(int a,int b){
this.a=a;
this.b=b;
}
public int compareTo(Node o) {
return (int)this.a-o.a; //从下到大排序
}
}
public static void main(String[] agrs) {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
Node[] node=new Node[n]; //一定要设置n的空间大小,不然会抛出空指针异常,java API sort排序
for(int i=0;i<n;i++){
node[i]=new Node(sc.nextInt(),sc.nextInt());
}
Arrays.sort(node);
int[] dp=new int[5005];
int res=0;
for(int i=0;i<n;i++) {
dp[i]=1;
for(int j=0;j<i;j++) {
if(node[i].b>=node[j].b) {
dp[i]=Math.max(dp[i], dp[j]+1);
}
}
res=Math.max(res, dp[i]); //记录最大值
}
System.out.println(res);
}
}