相关题目:
题目描述:
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。
北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。
编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
输入格式
第1行,一个整数N,表示城市数。
扫描二维码关注公众号,回复:
11762594 查看本文章
第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(a1是航道1,b2是
航道2)要想不相交只需把航道a1按顺序排,再找排序后a1对应的航道b2
的最长子序列;
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
PII arr[]=new PII[N+1];
for(int i=1;i<=N;i++){
int first=input.nextInt();
int second=input.nextInt();
arr[i]=new PII(first,second);
}
Arrays.sort(arr,1,N+1);
int []dp=new int[N+1];
int res=1;
for(int i=1;i<=N;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(arr[i].second>arr[j].second){
dp[i]=Math.max(dp[j]+1,dp[i]);
res=Math.max(dp[i],res);
}
}
}
System.out.println(res);
}
}
class PII implements Comparable<PII>{
public int first;
public int second;
public PII(int first,int second){
this.first=first;
this.second=second;
}
public int compareTo(PII o){
return Integer.compare(this.first,o.first);
}
}