【问题描述】

PALMIA国家被一条河流分成南北两岸,南北两岸上各有N个村庄。北岸的每一个村庄有一个唯一的朋友在南岸,且他们的朋友村庄彼此不同。

每一对朋友村庄想要一条船来连接他们,他们向政府提出申请以获得批准。由于河面上常常有雾,政府决定禁止船只航线相交(如果相交,则很可能导致碰船)。

你的任务是编写一个程序,帮助政府官员决定批准哪些船只航线,使得不相交的航线数目最大。

【输入文件】ships.in

输入文件由几组数据组成。每组数据的第一行有2个整数X,Y,中间有一个空格隔开,X代表PALMIA河的长度(10<=X<=6000),Y代表河的宽度(10<=Y<=100)。第二行包含整数N,表示分别坐落在南北两岸上的村庄的数目(1<=N<=5000)。在接下来的N行中,每一行有两个非负整数C,D,由一个空格隔开,分别表示这一对朋友村庄沿河岸与PALMIA河最西边界的距离(C代表北岸的村庄,D代表南岸的村庄),不存在同岸又同位置的村庄。最后一组数据的下面仅有一行,是两个0,也被一空格隔开。

【输出文件】ships.out

对输入文件的每一组数据,输出文件应在连续的行中表示出最大可能满足上述条件的航线的数目。

【输入样例】

30 4

7

22 4

2 6

10 3

15 12

9 8

17 17

4 2

0 0

【输出样例】

4

【问题分析】

这道题目相对来说思考难度较高,从字面意义上看不出问题的本质来,有点无法下手的感觉。

寻找规律自然要推几组数据,首先当然有从样例入手;

 

 

仔细观察上图:红色航线是合法的,那么他们满足什么规律呢?

C1 C2 C3 C4

北岸红线的端点: 4 9 15 17

南岸红线的端点: 2 8 12 17

D1 D2 D3 D4

不难看出无论线的斜率如何,都有这样的规律:

C1<C2<C3<C4 且 D1<D2<D3<D4

如果我们把输入数据排升序,问题变抽象为:

在一个序列(D)里找到最长的序列满足DI<DJ<Dk……且i<j<k

这样的话便是典型的最长非降子序列问题了。。。。

posted on 2013-06-11 23:33  冰尨  阅读(117)  评论(0)    收藏  举报

导航