1. 程式人生 > >ship(動態規劃)

ship(動態規劃)

動態規劃 輸出 一個 子序列 升序 端點 如果 2個 長度

(ships.pas/c/cpp) 來源:《奧賽經典》(提高篇)
【問題描述】
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
對輸入文件的每一組數據,輸出文件應在連續的行中表示出最大可能滿足上述條件的航線的數目。
【輸入樣例】
304
7
224
26
103
1512
98
1717
4
2
00
【輸出樣例】
4


分析:

簡單的動態規劃題目,兩條線不相交的條件是A1>A2&&B1>B2

所以我們首先確保兩個條件中的一個成立(對所有邊按照一邊的端點升序排列),然後需找另一邊端點的最大上升子序列即可

ship(動態規劃)