最长上升子序列模型之友好城市

相关题目

最长上升子序列

怪盗基德的滑翔翼

登山

导弹拦截

题目描述:

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(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);
    }

}

猜你喜欢

转载自blog.csdn.net/qq_44844588/article/details/108339318