Problem Description
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
Input
输入的第一行为T,表示测试示例的个数。对于每组测试数据,
第1行,一个整数N(1<=N<=5000),表示城市数。
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。(0<=xi<=10000)
第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
// 先以南岸排升序。处理数据时用求最长上升子序列的方法 #include<iostream> #include<algorithm> using namespace std; struct td { int x; // 南岸 int y; // 北岸 int z; // 累计 }*str; bool cmp(td a,td b) { if(a.x!=b.x) return a.x<b.x; //南岸升序 else return a.y<b.y; // 北岸升序 } int main() { int t,n,i,j,max; while(cin>>t) { while(t--) { cin>>n; str=(td *)malloc(sizeof(td)*n); for(i=0;i<n;i++) { cin>>str[i].x>>str[i].y; str[i].z=1; } sort(str,str+n,cmp); for(i=1;i<n;i++) { max=0; for(j=0;j<i;j++) if(str[i].y>str[j].y&&max<str[j].z) // 用北岸去判断 max=str[j].z; str[i].z+=max; } for(i=0;i<n;i++) if(max<str[i].z) max=str[i].z; cout<<max<<endl; } } return 0; }