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 4sample 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 演算法,指的是 乙個問題的解決是依賴於若干個和該問題相似,但比該問題的問題規模更小的問題時,所採用的一種演算法。動態規劃是自底向上的思考問題的方法,通常要從最底層的問題開始考慮。而這類問題的特點是 解決所有本層次問題後,就可以解決上一層的問題...