渡輪問題(動態規劃)

2021-07-11 02:00:05 字數 1729 閱讀 4101

description

palmia河在某國從東向西流,並把該國分成南北兩個部份。河的兩岸共有n個城市,且北岸的某個城市與南岸的某個城市是友好城市,而且對應的關係是一一對應。如下圖: 

現要求在兩個友好城市之間建立一條航線,但由於天氣關係,所有的航線都不能相交,因此就可能所有城市都建立航線。如上圖,則最多可建立兩條航線可保證航線不交叉。

input

第一行為乙個數n(n<=5000),表示城市的個數。第二行為n個數,表示南邊n個城市離河的源頭的距離(小於2^31-1)。第三行為n個數,表示北邊n個城市離河的源頭的距離(<2^31-1),距離為整數。

output

乙個數,能建立最多的航線。

sample input

5     //表示友好城市的對數 

1 2 3 4 5 

3 2 1 5 4

sample output

2  

解題思路:求最長不下降序列,狀態轉移方程為:
l(si)=max+1

1<=j,且sj

si為航線的終點座標值。

時間複雜度:

o(n^2)

程式:const

maxn=50000;

varn,i,j,t:longint;

f,a,b:array[0..maxn] of longint;

procedure qsort(l,r:longint);

vari,j,mid:longint;

begin

if l>=r then exit;

i:=l;j:=r;

mid:=a[l+random(r-l+1)];

repeat

while a[i]

while a[j]>mid do dec(j);

if i<=j then

begin

a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];

b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];

inc(i);dec(j);

end;

until i>j;

qsort(l,j);

qsort(i,r);

end;

begin

readln(n);

for i:=1 to n do

read(a[i]);

for i:=1 to n do

read(b[i]);

randomize;

qsort(1,n);

for i:=1 to n do

f[i]:=1;

for i:=n-1 downto 1 do

begin

t:=0;

for  

j:=i+1 to n do

if (b[j]>b[i]) and (f[j]>t) then t:=f[j];

if t>0 then f[i]:=t+1;

end;

t:=1;

for i:=2 to n do

if f[i]>f[t] then t:=i;

writeln(f[t]);

end.

版權屬於: chris

動態規劃問題

思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...

動態規劃問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...

動態規劃問題

以下內容基於個人理解。一 什麼是動態規劃 動態規劃 dp 演算法,指的是 乙個問題的解決是依賴於若干個和該問題相似,但比該問題的問題規模更小的問題時,所採用的一種演算法。動態規劃是自底向上的思考問題的方法,通常要從最底層的問題開始考慮。而這類問題的特點是 解決所有本層次問題後,就可以解決上一層的問題...