練習賽8.3.友好城市

友好城市

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 17 Accepted Submission(s) : 8

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

Palmia國有一條橫貫東西的大河,河有筆直的南北兩岸,岸上各有位置各不相同的N個城市。北岸的每個城市有且僅有一個友好城市在南岸,而且不同城市的友好城市不相同。每對友好城市都向政府申請在河上開闢一條直線航道連接兩個城市,但是由於河上霧太大,政府決定避免任意兩條航道交叉,以避免事故。編程幫助政府做出一些批准和拒絕申請的決定,使得在保證任意兩條航線不相交的情況下,被批准的申請儘量多。

Input

輸入的第一行爲T,表示測試示例的個數。對於每組測試數據,
第1行,一個整數N(1<=N<=5000),表示城市數。
第2行到第n+1行,每行兩個整數,中間用1個空格隔開,分別表示南岸和北岸的一對友好城市的座標。(0<=xi<=10000)

Output

對於每組測試數據,僅一行,輸出一個整數,表示政府所能批准的最多申請數。

Sample Input

1
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2

Sample Output

4
思路分析:本題目爲DP題。意思爲
//對第一隊進行排序,再以第二組選出最長上升子序列的長度就是不相交的數目
2	4	9	10	15	17	22
6	2	8	3	12	17	4
如圖所示對第二列求最長上升子序列的長度即爲所求,必須在裏面清零。
代碼:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct tmp
{
    int a,b;
}dp[5500];
bool cmp(tmp x,tmp y)
{
    if(x.a!=y.a) return x.a<y.a;
    else if(x.b!=y.b) return x.b<y.b;
}
int main()
{
    int t,n,max,i,j;
    int a[5500];
    scanf("%d",&t);


    while(t--)
    {
    memset(a,0,sizeof(a));
    memset(dp,0,sizeof(dp));


        scanf("%d",&n);
        for(i=0;i<n;i++)
           {
               scanf("%d %d",&dp[i].a,&dp[i].b);
           }
        sort(dp,dp+n,cmp);
        max=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<i;j++)
            {
                if(dp[j].b<dp[i].b&&a[i]<a[j]+1)
                {
                    a[i]=a[j]+1;
                    if(max<a[i])
                       max=a[i];
                }
            }
        }
        printf("%d\n",max+1);
    }
    return 0;
}
發佈了41 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章